Version 1.7.33

VDR developer version 1.7.33 is now available at

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

A 'diff' against the previous version is available at

       ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.32-1.7.33.diff

MD5 checksums:

7c21451360ac7959d0d95e533d34451c  vdr-1.7.33.tar.bz2
c79257198f8569bc02f43dc470ee3076  vdr-1.7.32-1.7.33.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.

IMPORTANT:
==========

This version of VDR no longer sets LC_NUMERIC to "C" in order to make
sure any floating point numbers written to configuration files use a
proper decimal point. It rather explicitly converts such numbers using the
new functions atod() and dtoa().
IF YOU USE PLUGINS THAT STORE FLOATING POINT NUMBERS IN THEIR OWN CONFIGURATION
FILES, YOU SHOULD SET
export LC_NUMERIC=C
BEFORE RUNNING VDR, UNTIL THESE PLUGINS HAVE BEEN PROPERLY UPDATED.

From the HISTORY file:
- In order to be able to play TS recordings from other sources, in which there is
  more than one PMT PID in the PAT, 'int cPatPmtParser::PatPmt(void)' has been changed
  to 'bool cPatPmtParser::IsPatPmt(int Pid)'.
- Fixed learning remote control keys with the LCARS skin.
- Updated the Macedonian OSD texts (thanks to Dimitar Petrovski).
- Fixed getting only non-video packets in cCuttingThread::GetPendingPackets() (reported
  by Sören Moch).
- Changed all occurrences of MPEG4 to H264 (pointed out by Sören Moch).
- Fixed getting the number of editing sequences in case the last sequence has no actual
  end mark.
- The cutter now only increments the TS continuity counter for packets that have a
  payload (pointed out by Sören Moch).
- Fixed adjusting the DTS values in the cutter, to compensate for dropped B-frames
  (pointed out by Sören Moch).
- Fixed a typo in skins.h (thanks to Lars Hanisch).
- Simplified calculating the PTS offset in cPtsFixer::Fix() and fixed the overflow
  handling of PCR values (thanks to Sören Moch).
- Fixed calling iconv_close() only with a valid iconv_t value (thanks to Juergen Lock).
- Fixed faulty opening of the Recordings menu when pressing the Play key during normal
  live viewing mode in case there is a "last viewed" recording.
- Fixed some #include statements in plugins to use <vdr/...> instead of "vdr/..."
  (thanks to Lars Hanisch).
- Fixed some spellings in osd.h and svdrp.c (thanks to Ville Skyttä).
- Fixed handling lowercase polarization characters in channel definitions if no DiSEqC
  is used (reported by Mike Hay, actual bug pointed out by Stefan Huelswitt).
- Synchronizing system time to the transponder time is now done using adjtime() in order
  to avoid discontinuities (suggested by Manuel Reimer). If the time difference is more
  than 10 seconds, stime() is still used to do the initial sync.
- The '7' and '9' keys now jump to the very beginning or end, respectively, of the
  recording, even if there is no mark set at that point (following a request from
  Andre Weidemann).
- Now always setting the TDT EIT filter, because otherwise when turning on using the
  transponder time in the Setup menu, it would only be used after the next restart
  of VDR (thanks to Sundararaj Reel).
- The new functions cDevice::CanScaleVideo() and cDevice::ScaleVideo() can be used by
  derived output devices to implement scaling the video to a given size and location
  (based on a suggestion by Lucian Muresan).
- The SVDRP command HITK now discards any keys if the remote control is currently
  turned off (thanks to Alexander Hans).
- The new remote control key "Play/Pause" can be used with remote controls that don't
  have separate keys for "Play" and "Pause", but rather have a single key for both
  functions (thanks to Stefan Hofmann for suggesting to implement support for such
  remote controls).
- The new option "Setup/Replay/Pause on mark set" can be used to activate automatically
  going into Pause mode if an editing mark is set during replay (suggested by Andre
  Weidemann).
- When regenerating the index of a recording, the frame rate stored in the info file
  is now automatically fixed if it differs from the value detected by the frame
  detector.
- Fixed creating the edited version directory if a relative file name is given in
  the call to 'vdr --edit' (the '/video' part was stripped from the given file name
  even if it wasn't there).
- The new option "Setup/Replay/Progress display time" can be used to activate
  automatically displaying the progress display whenever replay of a recording is
  started (suggested by Stefan Blochberger).
- Changed reading and writing of floating point numbers into configuration files to
  make it independent of the decimal point used in the current locale. All calls to
  atof() have been replaced with the new function atod(), which makes sure the string
  representation of a floating point number using a '.' as decimal point will be
  handled correctly, even if the locale in use expects a ',' as the decimal point.
  Plugins that read floating point numbers from their own configuration files will
  also need to use atod() for this, or use a method of their own (this is not necessary
  if values are stored in VDR's setup.conf file, because VDR takes care of this).
  The reason for these changes is that floating point numbers presented to the user
  shall be displayed in the way defined by the current locale (suggested by Stefan
  Blochberger).
  If you use plugins that store floating point values in configuration files of their
  own and have not yet been adapted to this change, you should set
  export LC_NUMERIC=C
  before running VDR. Otherwise your plugin's configuration data may not be read or
  written correctly.
- The new functions SetItemEvent(), SetItemTimer(), SetItemChannel() and
  SetItemRecording() of the cSkinDisplayMenu class can be reimplemented by skin
  plugins to display these items in a more elaborate way than just a simple line of
  text.
This commit is contained in:
Klaus Schmidinger 2012-12-08 12:38:00 +01:00 committed by Dieter Hametner
parent beffcabc81
commit 5109addf9c
60 changed files with 943 additions and 360 deletions

View File

@ -229,6 +229,8 @@ Stefan Huelswitt <s.huelswitt@gmx.de>
for a patch that was used to implement the --localedir option
for reporting a problem with updating CA descriptors in transfer mode on full
featured DVB cards
for pointing out a bug in handling lowercase polarization characters in channel
definitions if no DiSEqC is used
Ulrich Röder <roeder@efr-net.de>
for pointing out that there are channels that have a symbol rate higher than 27500
@ -1774,6 +1776,8 @@ Lucian Muresan <lucianm@users.sourceforge.net>
for reporting duplicate texts in i18n.c
for suggesting to use 'gettext' for internationalization
for exporting some libsi functions
for suggesting to add functions to cDevice that allow derived output devices to
implement scaling the video to a given size and location
Mattias Grönlund <Mattias@Gronlund.net>
for pointing out a missing cleanup at program exit in case there is a problem
@ -1976,6 +1980,7 @@ Ville Skytt
for pointing out that the variable HasSnr was unused in cDvbTuner::GetSignalQuality()
for fixing cConfig::Load() for g++ version 4.7.0
for fixing some typos in HISTORY and CONTRIBUTORS
for fixing some spellings in osd.h and svdrp.c
Steffen Beyer <cpunk@reactor.de>
for fixing setting the colored button help after deleting a recording in case the next
@ -2224,6 +2229,10 @@ Andr
for suggesting that the primary device should only be avoided for recording if
it is an old SD full featured card
for his support in using convert/ffmpeg in the pic2mpg script of the 'pictures' plugin
for requesting a way of getting to the very end of an edited recording, since version
1.7.32 no longer generates a mark at that point
for suggesting to automatically go into Pause mode if an editing mark is set during
replay
Jürgen Schilling <juergen_schilling@web.de>
for reporting that color buttons were displayed in the recording info menu if it
@ -2265,6 +2274,8 @@ Alexander Hans <cleditor@arcor.de>
for reporting that the "'1' for encrypted radio channels" part in the description
of the VPID in vdr.5 is obsolete
for a patch that was used to implement storing the channel name in info.vdr
for making the SVDRP command HITK discard any keys if the remote control is currently
turned off
Daniel Karsubka <dkar@gmx.de>
for suggesting to write the epg.data file when VDR exits
@ -2626,6 +2637,9 @@ Sundararaj Reel <sundararaj.reel@googlemail.com>
that might inadvertently be called with a 'char *' as the second argument on some
compilers and cause a crash
for reporting a possible memory leak in SI::StructureLoop::getNextAsPointer()
for making the TDT EIT filter always be set, because otherwise when turning on using
the transponder time in the Setup menu, it would only be used after the next restart
of VDR
Ales Jurik <ajurik@quick.cz>
for reporting broken SI data on Czech/Slovak channels after changing the default
@ -2728,6 +2742,8 @@ Manuel Reimer <Manuel.Reimer@gmx.de>
contains only the address of the local host
for a patch that was used as a base for making editing marks be updated every 10
seconds during replay
for suggesting to synchronize system time to the transponder time using adjtime() in
order to avoid discontinuities
Rene van den Braken <rene@vandenbraken.name>
for reporting a bug in writing the PCR pid into the PMT in
@ -2760,6 +2776,8 @@ Lars Hanisch <dvb@flensrocker.de>
for a patch that was used to implement SCR (Satellite Channel Routing)
for implementing the SVDRP command 'UPDR'
for reporting that the SVDRP command UPDR didn't update the global recordings list
for fixing a typo in skins.h
for fixing some #include statements in plugins to use <vdr/...> instead of "vdr/..."
Alex Lasnier <alex@fepg.org>
for adding tuning support for ATSC devices
@ -2834,6 +2852,7 @@ Juergen Lock <vdr-l@jelal.kn-bremen.de>
for fixing cUnbufferedFile::Seek() in case it is compiled without USE_FADVISE
for reporting a problem with EPG scan on systems with only a single DVB device that
use software output
for fixing calling iconv_close() only with a valid iconv_t value
Sergiu Dotenco <sergiu.dotenco@googlemail.com>
for reporting a missing initialization in sDvbSpuRect
@ -2958,7 +2977,7 @@ Oliver Schinagl <oliver@schinagl.nl>
for a patch that was used to implement the setup options "OSD/Color key [0123]"
Andrey Pridvorov <ua0lnj@bk.ru>
for reporting a problem with detecting frames in MPEG 4 video, and pointing towards
for reporting a problem with detecting frames in H.264 video, and pointing towards
a better way of doing it
Jens Vogel <jens.vogel@akjv.de>
@ -2970,6 +2989,29 @@ S
for a patch that was used to move cleaning up the EPG data and writing the epg.data
file into a separate thread to avoid sluggish response to user input on slow systems
for fixing sorting folders before recordings in case of UTF-8
for reporting that cCuttingThread::GetPendingPackets() should get only non-video
packets
for pointing out that the name H264 should be used instead of MPEG4
for pointing out that the cutter should only increment the TS continuity counter for
packets that have a payload
for pointing out that when adjusting the DTS values in the cutter, it hase to compensate
for dropped B-frames
for simplifying calculating the PTS offset in cPtsFixer::Fix() and fixing the overflow
handling of PCR values
Peter Münster <pmlists@free.fr>
for fixing 'make install' to not overwrite existing configuration files
Mike Hay <mike.hay@linenshorts.com>
for reporting a problem with handling the case of the polarization character in
channel definitions if no DiSEqC is used
Stefan Hofmann <stefan.hofmann@t-online.de>
for suggesting to implement support for remote controls that only have a combined
"Play/Pause" key instead of separate keys for "Play" and "Pause"
Stefan Blochberger <Stefan.Blochberger@gmx.de>
for suggesting to automatically display the progress display whenever replay of a
recording is started
for suggesting that floating point numbers presented to the user shall be displayed
in the way defined by the current locale

84
HISTORY
View File

@ -7245,7 +7245,7 @@ Video Disk Recorder Revision History
- Decreased the ring buffer put/get trigger sizes from 1/3 to 1/10.
- The script given to VDR with the '-r' option is now also called whenever a
recording is deleted (thanks to Alexander Wenzel).
- Improved detecting frames in MPEG 4 video (reported by Andrey Pridvorov).
- Improved detecting frames in H.264 video (reported by Andrey Pridvorov).
- cPatPmtParser::ParsePmt() now also recognizes stream type 0x81 as "AC3", so that
recordings that have been converted from the old PES format to TS can be played
(suggested by Jens Vogel).
@ -7305,7 +7305,7 @@ Video Disk Recorder Revision History
Sundararaj Reel).
- Fixed handling timers in case an event is modified and "phased out" while the timer
is recording.
- Improved frame detection by parsing just far enough into the MPEG-4 NAL units to get
- Improved frame detection by parsing just far enough into the H.264 NAL units to get
the necessary information about frames and slices.
- The initial syncing of the frame detector is now done immediately after the first
complete GOP has been seen. This makes recordings and especially pausing live video
@ -7334,7 +7334,85 @@ Video Disk Recorder Revision History
simply mark a position, but have no effect on the actual cutting process.
- When positioned at an offset where two (or more) editing marks are placed on top
of each other, the '4' key moves the first one of them to the left, while the '6'
key moves the last one of them to the right. The '7' and '9' key handle multiple
key moves the last one of them to the right. The '7' and '9' keys handle multiple
marks at the same place as if it were one single mark.
- Modified editing marks are now written to disk whenever the replay progress display
gets hidden (thanks to Christoph Haubrich).
2012-12-08: Version 1.7.33
- In order to be able to play TS recordings from other sources, in which there is
more than one PMT PID in the PAT, 'int cPatPmtParser::PatPmt(void)' has been changed
to 'bool cPatPmtParser::IsPatPmt(int Pid)'.
- Fixed learning remote control keys with the LCARS skin.
- Updated the Macedonian OSD texts (thanks to Dimitar Petrovski).
- Fixed getting only non-video packets in cCuttingThread::GetPendingPackets() (reported
by Sören Moch).
- Changed all occurrences of MPEG4 to H264 (pointed out by Sören Moch).
- Fixed getting the number of editing sequences in case the last sequence has no actual
end mark.
- The cutter now only increments the TS continuity counter for packets that have a
payload (pointed out by Sören Moch).
- Fixed adjusting the DTS values in the cutter, to compensate for dropped B-frames
(pointed out by Sören Moch).
- Fixed a typo in skins.h (thanks to Lars Hanisch).
- Simplified calculating the PTS offset in cPtsFixer::Fix() and fixed the overflow
handling of PCR values (thanks to Sören Moch).
- Fixed calling iconv_close() only with a valid iconv_t value (thanks to Juergen Lock).
- Fixed faulty opening of the Recordings menu when pressing the Play key during normal
live viewing mode in case there is a "last viewed" recording.
- Fixed some #include statements in plugins to use <vdr/...> instead of "vdr/..."
(thanks to Lars Hanisch).
- Fixed some spellings in osd.h and svdrp.c (thanks to Ville Skyttä).
- Fixed handling lowercase polarization characters in channel definitions if no DiSEqC
is used (reported by Mike Hay, actual bug pointed out by Stefan Huelswitt).
- Synchronizing system time to the transponder time is now done using adjtime() in order
to avoid discontinuities (suggested by Manuel Reimer). If the time difference is more
than 10 seconds, stime() is still used to do the initial sync.
- The '7' and '9' keys now jump to the very beginning or end, respectively, of the
recording, even if there is no mark set at that point (following a request from
Andre Weidemann).
- Now always setting the TDT EIT filter, because otherwise when turning on using the
transponder time in the Setup menu, it would only be used after the next restart
of VDR (thanks to Sundararaj Reel).
- The new functions cDevice::CanScaleVideo() and cDevice::ScaleVideo() can be used by
derived output devices to implement scaling the video to a given size and location
(based on a suggestion by Lucian Muresan).
- The SVDRP command HITK now discards any keys if the remote control is currently
turned off (thanks to Alexander Hans).
- The new remote control key "Play/Pause" can be used with remote controls that don't
have separate keys for "Play" and "Pause", but rather have a single key for both
functions (thanks to Stefan Hofmann for suggesting to implement support for such
remote controls).
- The new option "Setup/Replay/Pause on mark set" can be used to activate automatically
going into Pause mode if an editing mark is set during replay (suggested by Andre
Weidemann).
- When regenerating the index of a recording, the frame rate stored in the info file
is now automatically fixed if it differs from the value detected by the frame
detector.
- Fixed creating the edited version directory if a relative file name is given in
the call to 'vdr --edit' (the '/video' part was stripped from the given file name
even if it wasn't there).
- The new option "Setup/Replay/Progress display time" can be used to activate
automatically displaying the progress display whenever replay of a recording is
started (suggested by Stefan Blochberger).
- Changed reading and writing of floating point numbers into configuration files to
make it independent of the decimal point used in the current locale. All calls to
atof() have been replaced with the new function atod(), which makes sure the string
representation of a floating point number using a '.' as decimal point will be
handled correctly, even if the locale in use expects a ',' as the decimal point.
Plugins that read floating point numbers from their own configuration files will
also need to use atod() for this, or use a method of their own (this is not necessary
if values are stored in VDR's setup.conf file, because VDR takes care of this).
The reason for these changes is that floating point numbers presented to the user
shall be displayed in the way defined by the current locale (suggested by Stefan
Blochberger).
If you use plugins that store floating point values in configuration files of their
own and have not yet been adapted to this change, you should set
export LC_NUMERIC=C
before running VDR. Otherwise your plugin's configuration data may not be read or
written correctly.
- The new functions SetItemEvent(), SetItemTimer(), SetItemChannel() and
SetItemRecording() of the cSkinDisplayMenu class can be reimplemented by skin
plugins to display these items in a more elaborate way than just a simple line of
text.

14
MANUAL
View File

@ -39,6 +39,7 @@ Version 1.6
Info display information on the currently viewed programme or recording,
or on the current item in a menu
Play/Pause combined key to resume or pause replay, or pause live video
Play resume normal replay
Pause pause replay or live video
Stop stop replay
@ -365,7 +366,9 @@ Version 1.6
- 4, 6 Move an editing mark back and forward. You need to first jump to
an editing mark for this to work.
- 7, 9 Jump back and forward between editing marks. Replay goes into still
mode after jumping to a mark.
mode after jumping to a mark. If the current position is at the
first or last mark, or if there are no marks at all, these keys
jump to the very beginning or end, respectively, of the recording.
- 8 Positions replay at a point 3 seconds before the current or next
"begin" mark and starts replay.
- 2 Start the actual cutting process.
@ -879,6 +882,15 @@ Version 1.6
Defines whether the replay progress display shows the
remaining time or the total length of the recording.
Progress display time (s) = 0
Defines how long (in seconds) the progress display is shown
when replay of a recording is started. The default value of 0
means that it will not be shown.
Pause replay when setting mark = no
Defines whether the player automatically goes into Pause
mode when setting an editing mark.
Resume ID = 0 Defines an additional ID that can be used in a multi user
environment, so that every user has his/her own resume
files for each recording. The valid range is 0...99, with

View File

@ -3,15 +3,15 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: dvbhdffdevice.h 1.8 2012/11/05 08:49:29 kls Exp $
* $Id: dvbhdffdevice.h 1.9 2012/12/03 13:43:55 kls Exp $
*/
#ifndef __DVBHDFFDEVICE_H
#define __DVBHDFFDEVICE_H
#include "hdffcmd.h"
#include "vdr/dvbdevice.h"
#include "vdr/dvbspu.h"
#include <vdr/dvbdevice.h>
#include <vdr/dvbspu.h>
/// The cDvbHdFfDevice implements a DVB device which can be accessed through the Linux DVB driver API.

View File

@ -3,14 +3,14 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: dvbsdffdevice.h 2.13 2011/08/27 11:32:42 kls Exp $
* $Id: dvbsdffdevice.h 2.14 2012/12/03 13:43:55 kls Exp $
*/
#ifndef __DVBSDFFDEVICE_H
#define __DVBSDFFDEVICE_H
#include "vdr/dvbdevice.h"
#include "vdr/dvbspu.h"
#include <vdr/dvbdevice.h>
#include <vdr/dvbspu.h>
/// The cDvbSdFfDevice implements a DVB device which can be accessed through the Linux DVB driver API.

View File

@ -3,13 +3,13 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: dvbsdffosd.h 2.1 2009/12/29 11:52:05 kls Exp $
* $Id: dvbsdffosd.h 2.2 2012/12/03 13:43:55 kls Exp $
*/
#ifndef __DVBSDFFODF_H
#define __DVBSDFFODF_H
#include "vdr/osd.h"
#include <vdr/osd.h>
class cDvbOsdProvider : public cOsdProvider {
private:

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: config.c 2.28 2012/09/15 11:52:03 kls Exp $
* $Id: config.c 2.31 2012/12/06 09:00:23 kls Exp $
*/
#include "config.h"
@ -458,6 +458,8 @@ cSetup::cSetup(void)
MultiSpeedMode = 0;
ShowReplayMode = 0;
ShowRemainingTime = 0;
ProgressDisplayTime = 0;
PauseOnMarkSet = 0;
ResumeID = 0;
CurrentChannel = -1;
CurrentVolume = MAXVOLUME;
@ -507,7 +509,7 @@ void cSetup::Store(const char *Name, int Value, const char *Plugin)
void cSetup::Store(const char *Name, double &Value, const char *Plugin)
{
Store(Name, cString::sprintf("%f", Value), Plugin);
Store(Name, dtoa(Value), Plugin);
}
bool cSetup::Load(const char *FileName)
@ -628,24 +630,24 @@ bool cSetup::Parse(const char *Name, const char *Value)
else if (!strcasecmp(Name, "UseDolbyDigital")) UseDolbyDigital = atoi(Value);
else if (!strcasecmp(Name, "ChannelInfoPos")) ChannelInfoPos = atoi(Value);
else if (!strcasecmp(Name, "ChannelInfoTime")) ChannelInfoTime = atoi(Value);
else if (!strcasecmp(Name, "OSDLeftP")) OSDLeftP = atof(Value);
else if (!strcasecmp(Name, "OSDTopP")) OSDTopP = atof(Value);
else if (!strcasecmp(Name, "OSDWidthP")) { OSDWidthP = atof(Value); ChkDoublePlausibility(OSDWidthP, 0.87); }
else if (!strcasecmp(Name, "OSDHeightP")) { OSDHeightP = atof(Value); ChkDoublePlausibility(OSDHeightP, 0.84); }
else if (!strcasecmp(Name, "OSDLeftP")) OSDLeftP = atod(Value);
else if (!strcasecmp(Name, "OSDTopP")) OSDTopP = atod(Value);
else if (!strcasecmp(Name, "OSDWidthP")) { OSDWidthP = atod(Value); ChkDoublePlausibility(OSDWidthP, 0.87); }
else if (!strcasecmp(Name, "OSDHeightP")) { OSDHeightP = atod(Value); ChkDoublePlausibility(OSDHeightP, 0.84); }
else if (!strcasecmp(Name, "OSDLeft")) OSDLeft = atoi(Value);
else if (!strcasecmp(Name, "OSDTop")) OSDTop = atoi(Value);
else if (!strcasecmp(Name, "OSDWidth")) { OSDWidth = atoi(Value); OSDWidth &= ~0x07; } // OSD width must be a multiple of 8
else if (!strcasecmp(Name, "OSDHeight")) OSDHeight = atoi(Value);
else if (!strcasecmp(Name, "OSDAspect")) OSDAspect = atof(Value);
else if (!strcasecmp(Name, "OSDAspect")) OSDAspect = atod(Value);
else if (!strcasecmp(Name, "OSDMessageTime")) OSDMessageTime = atoi(Value);
else if (!strcasecmp(Name, "UseSmallFont")) UseSmallFont = atoi(Value);
else if (!strcasecmp(Name, "AntiAlias")) AntiAlias = atoi(Value);
else if (!strcasecmp(Name, "FontOsd")) Utf8Strn0Cpy(FontOsd, Value, MAXFONTNAME);
else if (!strcasecmp(Name, "FontSml")) Utf8Strn0Cpy(FontSml, Value, MAXFONTNAME);
else if (!strcasecmp(Name, "FontFix")) Utf8Strn0Cpy(FontFix, Value, MAXFONTNAME);
else if (!strcasecmp(Name, "FontOsdSizeP")) { FontOsdSizeP = atof(Value); ChkDoublePlausibility(FontOsdSizeP, 0.038); }
else if (!strcasecmp(Name, "FontSmlSizeP")) { FontSmlSizeP = atof(Value); ChkDoublePlausibility(FontSmlSizeP, 0.035); }
else if (!strcasecmp(Name, "FontFixSizeP")) { FontFixSizeP = atof(Value); ChkDoublePlausibility(FontFixSizeP, 0.031); }
else if (!strcasecmp(Name, "FontOsdSizeP")) { FontOsdSizeP = atod(Value); ChkDoublePlausibility(FontOsdSizeP, 0.038); }
else if (!strcasecmp(Name, "FontSmlSizeP")) { FontSmlSizeP = atod(Value); ChkDoublePlausibility(FontSmlSizeP, 0.035); }
else if (!strcasecmp(Name, "FontFixSizeP")) { FontFixSizeP = atod(Value); ChkDoublePlausibility(FontFixSizeP, 0.031); }
else if (!strcasecmp(Name, "FontOsdSize")) FontOsdSize = atoi(Value);
else if (!strcasecmp(Name, "FontSmlSize")) FontSmlSize = atoi(Value);
else if (!strcasecmp(Name, "FontFixSize")) FontFixSize = atoi(Value);
@ -658,6 +660,8 @@ bool cSetup::Parse(const char *Name, const char *Value)
else if (!strcasecmp(Name, "MultiSpeedMode")) MultiSpeedMode = atoi(Value);
else if (!strcasecmp(Name, "ShowReplayMode")) ShowReplayMode = atoi(Value);
else if (!strcasecmp(Name, "ShowRemainingTime")) ShowRemainingTime = atoi(Value);
else if (!strcasecmp(Name, "ProgressDisplayTime")) ProgressDisplayTime= atoi(Value);
else if (!strcasecmp(Name, "PauseOnMarkSet")) PauseOnMarkSet = atoi(Value);
else if (!strcasecmp(Name, "ResumeID")) ResumeID = atoi(Value);
else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value);
else if (!strcasecmp(Name, "CurrentVolume")) CurrentVolume = atoi(Value);
@ -761,6 +765,8 @@ bool cSetup::Save(void)
Store("MultiSpeedMode", MultiSpeedMode);
Store("ShowReplayMode", ShowReplayMode);
Store("ShowRemainingTime", ShowRemainingTime);
Store("ProgressDisplayTime",ProgressDisplayTime);
Store("PauseOnMarkSet", PauseOnMarkSet);
Store("ResumeID", ResumeID);
Store("CurrentChannel", CurrentChannel);
Store("CurrentVolume", CurrentVolume);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: config.h 2.54 2012/10/03 09:59:34 kls Exp $
* $Id: config.h 2.57 2012/12/05 11:33:20 kls Exp $
*/
#ifndef __CONFIG_H
@ -22,13 +22,13 @@
// VDR's own version number:
#define VDRVERSION "1.7.32"
#define VDRVERSNUM 10732 // Version * 10000 + Major * 100 + Minor
#define VDRVERSION "1.7.33"
#define VDRVERSNUM 10733 // Version * 10000 + Major * 100 + Minor
// The plugin API's version number:
#define APIVERSION "1.7.32"
#define APIVERSNUM 10732 // Version * 10000 + Major * 100 + Minor
#define APIVERSION "1.7.33"
#define APIVERSNUM 10733 // 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
@ -319,6 +319,8 @@ public:
int MultiSpeedMode;
int ShowReplayMode;
int ShowRemainingTime;
int ProgressDisplayTime;
int PauseOnMarkSet;
int ResumeID;
int CurrentChannel;
int CurrentVolume;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: cutter.c 2.16 2012/11/18 12:09:00 kls Exp $
* $Id: cutter.c 2.21 2012/12/02 14:30:55 kls Exp $
*/
#include "cutter.h"
@ -132,7 +132,7 @@ bool cDanglingPacketStripper::Process(uchar *Data, int Length, int64_t FirstPts)
int Pid = TsPid(Data);
if (Pid == PATPID)
patPmtParser.ParsePat(Data, TS_SIZE);
else if (Pid == patPmtParser.PmtPid())
else if (patPmtParser.IsPmtPid(Pid))
patPmtParser.ParsePmt(Data, TS_SIZE);
else {
int64_t Pts = TsGetPts(Data, TS_SIZE);
@ -154,8 +154,10 @@ bool cDanglingPacketStripper::Process(uchar *Data, int Length, int64_t FirstPts)
class cPtsFixer {
private:
int delta; // time between two frames
int64_t last; // the last (i.e. highest) video PTS value seen
int64_t offset; // offset to add to PTS values
int64_t deltaDts; // the difference between two consecutive DTS values (may differ from 'delta' in case of multiple fields per frame)
int64_t lastPts; // the video PTS of the last frame (in display order)
int64_t lastDts; // the last video DTS value seen
int64_t offset; // offset to add to all timestamps
bool fixCounters; // controls fixing the TS continuity counters (only from the second CutIn up)
uchar counter[MAXPID]; // the TS continuity counter for each PID
cPatPmtParser patPmtParser;
@ -168,7 +170,9 @@ public:
cPtsFixer::cPtsFixer(void)
{
delta = 0;
last = -1;
deltaDts = 0;
lastPts = -1;
lastDts = -1;
offset = -1;
fixCounters = false;
memset(counter, 0x00, sizeof(counter));
@ -186,31 +190,44 @@ void cPtsFixer::Fix(uchar *Data, int Length, bool CutIn)
return;
}
// Determine the PTS offset at the beginning of each sequence (except the first one):
if (CutIn && last >= 0) {
if (CutIn && lastPts >= 0) {
int64_t Pts = TsGetPts(Data, Length);
if (Pts >= 0) {
// offset is calculated so that Pts + offset results in last + delta:
offset = Pts - PtsAdd(last, delta);
if (offset <= 0)
offset = -offset;
else
offset = MAX33BIT + 1 - offset;
}
if (Pts >= 0)
offset = (lastPts + delta - Pts) & MAX33BIT; // offset is calculated so that Pts + offset results in lastPts + delta
fixCounters = true;
}
// Keep track of the highest video PTS:
bool GotPts = false;
int64_t PrevDts = lastDts;
uchar *p = Data;
int len = Length;
while (len >= TS_SIZE && *p == TS_SYNC_BYTE) {
int Pid = TsPid(p);
if (Pid == patPmtParser.Vpid()) {
int64_t Pts = PtsAdd(TsGetPts(p, TS_SIZE), offset); // offset is taken into account here, to make last have the "new" value already!
if (Pts >= 0 && (last < 0 || PtsDiff(last, Pts) > 0))
last = Pts;
if (!GotPts) { // in case of multiple fields per frame, the offset is calculated only with the first one
int64_t Pts = TsGetPts(p, TS_SIZE);
if (Pts >= 0) {
if (offset >= 0)
Pts = PtsAdd(Pts, offset); // offset is taken into account here, to make lastPts have the "new" value already!
if (lastPts < 0 || PtsDiff(lastPts, Pts) > 0)
lastPts = Pts;
}
GotPts = true;
}
if (!CutIn) {
int64_t Dts = TsGetDts(p, TS_SIZE);
if (Dts >= 0) {
if (offset >= 0)
Dts = PtsAdd(Dts, offset); // offset is taken into account here, to make lastDts have the "new" value already!
deltaDts = PtsDiff(PrevDts, Dts);
PrevDts = Dts;
}
}
}
// Adjust the TS continuity counter:
if (fixCounters) {
counter[Pid] = (counter[Pid] + 1) & TS_CONT_CNT_MASK;
if (TsHasPayload(p))
counter[Pid] = (counter[Pid] + 1) & TS_CONT_CNT_MASK;
TsSetContinuityCounter(p, counter[Pid]);
}
else
@ -228,12 +245,18 @@ void cPtsFixer::Fix(uchar *Data, int Length, bool CutIn)
if (Pts >= 0)
TsSetPts(p, TS_SIZE, PtsAdd(Pts, offset));
int64_t Dts = TsGetDts(p, TS_SIZE);
if (Dts >= 0)
TsSetDts(p, TS_SIZE, PtsAdd(Dts, offset));
if (Dts >= 0) {
if (CutIn) {
lastDts = PtsAdd(lastDts, deltaDts);
TsSetDts(p, TS_SIZE, lastDts);
}
else
TsSetDts(p, TS_SIZE, PtsAdd(Dts, offset));
}
int64_t Pcr = TsGetPcr(p);
if (Pcr >= 0) {
int64_t NewPcr = Pcr + offset * PCRFACTOR;
if (NewPcr >= MAX27MHZ)
if (NewPcr > MAX27MHZ)
NewPcr -= MAX27MHZ + 1;
TsSetPcr(p, NewPcr);
}
@ -241,6 +264,7 @@ void cPtsFixer::Fix(uchar *Data, int Length, bool CutIn)
len -= TS_SIZE;
}
}
lastDts = PrevDts;
}
// --- cCuttingThread --------------------------------------------------------
@ -408,8 +432,10 @@ void cCuttingThread::GetPendingPackets(uchar *Data, int &Length, int Index, int6
int Pid = TsPid(p);
if (Pid == PATPID)
PatPmtParser.ParsePat(p, TS_SIZE);
else if (Pid == PatPmtParser.PmtPid())
else if (PatPmtParser.IsPmtPid(Pid)) {
PatPmtParser.ParsePmt(p, TS_SIZE);
Processed[PatPmtParser.Vpid()] = true; // we only want non-video packets
}
else if (!Processed[Pid]) {
int64_t Pts = TsGetPts(p, TS_SIZE);
if (Pts >= 0) {

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: device.c 2.69 2012/11/13 09:11:43 kls Exp $
* $Id: device.c 2.70 2012/11/19 09:59:09 kls Exp $
*/
#include "device.h"
@ -1149,7 +1149,7 @@ void cDevice::StillPicture(const uchar *Data, int Length)
int Pid = TsPid(Data);
if (Pid == PATPID)
patPmtParser.ParsePat(Data, TS_SIZE);
else if (Pid == patPmtParser.PmtPid())
else if (patPmtParser.IsPmtPid(Pid))
patPmtParser.ParsePmt(Data, TS_SIZE);
else if (Pid == patPmtParser.Vpid()) {
if (TsPayloadStart(Data)) {
@ -1486,7 +1486,7 @@ int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
if (PayloadOffset < TS_SIZE) {
if (Pid == PATPID)
patPmtParser.ParsePat(Data, TS_SIZE);
else if (Pid == patPmtParser.PmtPid())
else if (patPmtParser.IsPmtPid(Pid))
patPmtParser.ParsePmt(Data, TS_SIZE);
else if (Pid == patPmtParser.Vpid()) {
isPlayingVideo = true;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: device.h 2.41 2012/08/26 13:25:44 kls Exp $
* $Id: device.h 2.42 2012/12/04 11:52:58 kls Exp $
*/
#ifndef __DEVICE_H
@ -655,6 +655,33 @@ public:
virtual bool IsPlayingVideo(void) const { return isPlayingVideo; }
///< \return Returns true if the currently attached player has delivered
///< any video packets.
virtual cRect CanScaleVideo(const cRect &Rect, int Alignment = taCenter) { return cRect::Null; }
///< Asks the output device whether it can scale the currently shown video in
///< such a way that it fits into the given Rect, while retaining its proper
///< aspect ratio. If the scaled video doesn't exactly fit into Rect, Alignment
///< is used to determine how to align the actual rectangle with the requested
///< one. The actual rectangle can be smaller, larger or the same size as the
///< given Rect, and its location may differ, depending on the capabilities of
///< the output device, which may not be able to display a scaled video at
///< arbitrary sizes and locations. The device shall, however, do its best to
///< match the requested Rect as closely as possible, preferring a size and
///< location that fits completely into the requested Rect if possible.
///< Returns the rectangle that can actually be used when scaling the video.
///< A skin plugin using this function should rearrange its content according
///< to the rectangle returned from calling this function, and should especially
///< be prepared for cases where the returned rectangle is way off the requested
///< Rect, or even Null. In such cases, the skin may want to fall back to
///< working with full screen video.
///< If this device can't scale the video, a Null rectangle is returned (this
///< is also the default implementation).
virtual void ScaleVideo(const cRect &Rect = cRect::Null) {}
///< Scales the currently shown video in such a way that it fits into the given
///< Rect. Rect should be one retrieved through a previous call to
///< CanScaleVideo() (otherwise results may be undefined).
///< Even if video output is scaled, the functions GetVideoSize() and
///< GetOsdSize() must still return the same values as if in full screen mode!
///< If this device can't scale the video, nothing happens.
///< To restore full screen video, call this function with a Null rectangle.
virtual bool HasIBPTrickSpeed(void) { return false; }
///< Returns true if this device can handle all frames in 'fast forward'
///< trick speeds.

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: dvbdevice.c 2.74 2012/10/07 11:11:30 kls Exp $
* $Id: dvbdevice.c 2.75 2012/12/03 14:07:01 kls Exp $
*/
#include "dvbdevice.h"
@ -261,16 +261,16 @@ bool cDvbTransponderParameters::Parse(const char *s)
case 'C': s = ParseParameter(s, coderateH, CoderateValues); break;
case 'D': s = ParseParameter(s, coderateL, CoderateValues); break;
case 'G': s = ParseParameter(s, guard, GuardValues); break;
case 'H': polarization = *s++; break;
case 'H': polarization = 'H'; s++; break;
case 'I': s = ParseParameter(s, inversion, InversionValues); break;
case 'L': polarization = *s++; break;
case 'L': polarization = 'L'; s++; break;
case 'M': s = ParseParameter(s, modulation, ModulationValues); break;
case 'O': s = ParseParameter(s, rollOff, RollOffValues); break;
case 'P': s = ParseParameter(s, plpId); break;
case 'R': polarization = *s++; break;
case 'R': polarization = 'R'; s++; break;
case 'S': s = ParseParameter(s, system, SystemValuesSat); break; // we only need the numerical value, so Sat or Terr doesn't matter
case 'T': s = ParseParameter(s, transmission, TransmissionValues); break;
case 'V': polarization = *s++; break;
case 'V': polarization = 'V'; s++; break;
case 'Y': s = ParseParameter(s, hierarchy, HierarchyValues); break;
default: esyslog("ERROR: unknown parameter key '%c'", *s);
return false;

37
eit.c
View File

@ -8,10 +8,11 @@
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
* Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
*
* $Id: eit.c 2.21 2012/08/25 11:13:00 kls Exp $
* $Id: eit.c 2.23 2012/12/04 11:10:10 kls Exp $
*/
#include "eit.h"
#include <sys/time.h>
#include "epg.h"
#include "i18n.h"
#include "libsi/section.h"
@ -313,35 +314,48 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
// --- cTDT ------------------------------------------------------------------
#define MAX_TIME_DIFF 1 // number of seconds the local time may differ from dvb time before making any corrections
#define MAX_ADJ_DIFF 10 // number of seconds the local time may differ from dvb time to allow smooth adjustment
#define ADJ_DELTA 300 // number of seconds between calls for smooth time adjustment
class cTDT : public SI::TDT {
private:
static cMutex mutex;
static int lastDiff;
static time_t lastAdj;
public:
cTDT(const u_char *Data);
};
cMutex cTDT::mutex;
int cTDT::lastDiff = 0;
time_t cTDT::lastAdj = 0;
cTDT::cTDT(const u_char *Data)
:SI::TDT(Data, false)
{
CheckParse();
time_t sattim = getTime();
time_t dvbtim = getTime();
time_t loctim = time(NULL);
int diff = abs(sattim - loctim);
if (diff > 2) {
int diff = dvbtim - loctim;
if (abs(diff) > MAX_TIME_DIFF) {
mutex.Lock();
if (abs(diff - lastDiff) < 3) {
if (stime(&sattim) == 0)
isyslog("system time changed from %s (%ld) to %s (%ld)", *TimeToString(loctim), loctim, *TimeToString(sattim), sattim);
if (abs(diff) > MAX_ADJ_DIFF) {
if (stime(&dvbtim) == 0)
isyslog("system time changed from %s (%ld) to %s (%ld)", *TimeToString(loctim), loctim, *TimeToString(dvbtim), dvbtim);
else
esyslog("ERROR while setting system time: %m");
}
lastDiff = diff;
else if (time(NULL) - lastAdj > ADJ_DELTA) {
lastAdj = time(NULL);
timeval delta;
delta.tv_sec = diff;
delta.tv_usec = 0;
if (adjtime(&delta, NULL) == 0)
isyslog("system time adjustment initiated from %s (%ld) to %s (%ld)", *TimeToString(loctim), loctim, *TimeToString(dvbtim), dvbtim);
else
esyslog("ERROR while adjusting system time: %m");
}
mutex.Unlock();
}
}
@ -353,8 +367,7 @@ time_t cEitFilter::disableUntil = 0;
cEitFilter::cEitFilter(void)
{
Set(0x12, 0x40, 0xC0); // event info now&next actual/other TS (0x4E/0x4F), future actual/other TS (0x5X/0x6X)
if (Setup.SetSystemTime && Setup.TimeTransponder)
Set(0x14, 0x70); // TDT
Set(0x14, 0x70); // TDT
}
void cEitFilter::SetDisableUntil(time_t Time)

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: interface.c 2.1 2011/12/04 14:52:38 kls Exp $
* $Id: interface.c 2.2 2012/11/19 12:21:43 kls Exp $
*/
#include "interface.h"
@ -160,6 +160,7 @@ void cInterface::LearnKeys(void)
dsyslog("remote control %s - %s", Remote->Name(), known ? "keys known" : "learning keys");
if (!known) {
cSkinDisplayMenu *DisplayMenu = Skins.Current()->DisplayMenu();
DisplayMenu->SetMenuCategory(mcUnknown);
char Headline[256];
snprintf(Headline, sizeof(Headline), tr("Learning Remote Control Keys"));
cRemote::Clear();

3
keys.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: keys.c 2.1 2010/04/05 10:05:58 kls Exp $
* $Id: keys.c 2.2 2012/12/04 12:52:52 kls Exp $
*/
#include "keys.h"
@ -33,6 +33,7 @@ static tKey keyTable[] = { // "Up" and "Down" must be the first two keys!
{ k8, "8" },
{ k9, "9" },
{ kInfo, trNOOP("Key$Info") },
{ kPlayPause, trNOOP("Key$Play/Pause") },
{ kPlay, trNOOP("Key$Play") },
{ kPause, trNOOP("Key$Pause") },
{ kStop, trNOOP("Key$Stop") },

3
keys.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: keys.h 2.1 2010/04/05 10:06:04 kls Exp $
* $Id: keys.h 2.2 2012/12/04 12:51:25 kls Exp $
*/
#ifndef __KEYS_H
@ -27,6 +27,7 @@ enum eKeys { // "Up" and "Down" must be the first two keys!
kBlue,
k0, k1, k2, k3, k4, k5, k6, k7, k8, k9,
kInfo,
kPlayPause, // combined Play/Pause key
kPlay,
kPause,
kStop,

182
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: menu.c 2.65 2012/11/18 13:07:53 kls Exp $
* $Id: menu.c 2.71 2012/12/07 13:48:15 kls Exp $
*/
#include "menu.h"
@ -284,6 +284,7 @@ public:
virtual int Compare(const cListObject &ListObject) const;
virtual void Set(void);
cChannel *Channel(void) { return channel; }
virtual void SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable);
};
cMenuChannelItem::eChannelSortMode cMenuChannelItem::sortMode = csmNumber;
@ -323,6 +324,12 @@ void cMenuChannelItem::Set(void)
SetText(buffer);
}
void cMenuChannelItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable)
{
if (!DisplayMenu->SetItemChannel(channel, Index, Current, Selectable, sortMode == csmProvider))
DisplayMenu->SetItem(Text(), Index, Current, Selectable);
}
// --- cMenuChannels ---------------------------------------------------------
#define CHANNELNUMBERTIMEOUT 1000 //ms
@ -1001,6 +1008,7 @@ public:
virtual int Compare(const cListObject &ListObject) const;
virtual void Set(void);
cTimer *Timer(void) { return timer; }
virtual void SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable);
};
cMenuTimerItem::cMenuTimerItem(cTimer *Timer)
@ -1049,6 +1057,12 @@ void cMenuTimerItem::Set(void)
File));
}
void cMenuTimerItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable)
{
if (!DisplayMenu->SetItemTimer(timer, Index, Current, Selectable))
DisplayMenu->SetItem(Text(), Index, Current, Selectable);
}
// --- cMenuTimers -----------------------------------------------------------
class cMenuTimers : public cOsdMenu {
@ -1215,7 +1229,7 @@ cMenuEvent::cMenuEvent(const cEvent *Event, bool CanSwitch, bool Buttons)
cChannel *channel = Channels.GetByChannelID(event->ChannelID(), true);
if (channel) {
SetTitle(channel->Name());
int TimerMatch = tmNone;
eTimerMatch TimerMatch = tmNone;
Timers.GetMatch(event, &TimerMatch);
if (Buttons)
SetHelp(TimerMatch == tmFull ? tr("Button$Timer") : tr("Button$Record"), NULL, NULL, CanSwitch ? tr("Button$Switch") : NULL);
@ -1273,13 +1287,14 @@ public:
const cEvent *event;
const cChannel *channel;
bool withDate;
int timerMatch;
eTimerMatch timerMatch;
cMenuScheduleItem(const cEvent *Event, cChannel *Channel = NULL, bool WithDate = false);
static void SetSortMode(eScheduleSortMode SortMode) { sortMode = SortMode; }
static void IncSortMode(void) { sortMode = eScheduleSortMode((sortMode == ssmAllAll) ? ssmAllThis : sortMode + 1); }
static eScheduleSortMode SortMode(void) { return sortMode; }
virtual int Compare(const cListObject &ListObject) const;
bool Update(bool Force = false);
virtual void SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable);
};
cMenuScheduleItem::eScheduleSortMode cMenuScheduleItem::sortMode = ssmAllThis;
@ -1309,7 +1324,7 @@ static const char *TimerMatchChars = " tT";
bool cMenuScheduleItem::Update(bool Force)
{
bool result = false;
int OldTimerMatch = timerMatch;
eTimerMatch OldTimerMatch = timerMatch;
Timers.GetMatch(event, &timerMatch);
if (Force || timerMatch != OldTimerMatch) {
cString buffer;
@ -1330,6 +1345,12 @@ bool cMenuScheduleItem::Update(bool Force)
return result;
}
void cMenuScheduleItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable)
{
if (!DisplayMenu->SetItemEvent(event, Index, Current, Selectable, channel, withDate, timerMatch))
DisplayMenu->SetItem(Text(), Index, Current, Selectable);
}
// --- cMenuWhatsOn ----------------------------------------------------------
class cMenuWhatsOn : public cOsdMenu {
@ -1430,7 +1451,7 @@ eOSState cMenuWhatsOn::Record(void)
cMenuScheduleItem *item = (cMenuScheduleItem *)Get(Current());
if (item) {
if (item->timerMatch == tmFull) {
int tm = tmNone;
eTimerMatch tm = tmNone;
cTimer *timer = Timers.GetMatch(item->event, &tm);
if (timer)
return AddSubMenu(new cMenuEditTimer(timer));
@ -1676,7 +1697,7 @@ eOSState cMenuSchedule::Record(void)
cMenuScheduleItem *item = (cMenuScheduleItem *)Get(Current());
if (item) {
if (item->timerMatch == tmFull) {
int tm = tmNone;
eTimerMatch tm = tmNone;
cTimer *timer = Timers.GetMatch(item->event, &tm);
if (timer)
return AddSubMenu(new cMenuEditTimer(timer));
@ -2153,7 +2174,8 @@ eOSState cMenuRecording::ProcessKey(eKeys Key)
class cMenuRecordingItem : public cOsdItem {
private:
char *fileName;
cRecording *recording;
int level;
char *name;
int totalEntries, newEntries;
public:
@ -2161,13 +2183,15 @@ public:
~cMenuRecordingItem();
void IncrementCounter(bool New);
const char *Name(void) { return name; }
const char *FileName(void) { return fileName; }
cRecording *Recording(void) { return recording; }
bool IsDirectory(void) { return name != NULL; }
virtual void SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable);
};
cMenuRecordingItem::cMenuRecordingItem(cRecording *Recording, int Level)
{
fileName = strdup(Recording->FileName());
recording = Recording;
level = Level;
name = NULL;
totalEntries = newEntries = 0;
SetText(Recording->Title('\t', true, Level));
@ -2177,7 +2201,6 @@ cMenuRecordingItem::cMenuRecordingItem(cRecording *Recording, int Level)
cMenuRecordingItem::~cMenuRecordingItem()
{
free(fileName);
free(name);
}
@ -2189,6 +2212,12 @@ void cMenuRecordingItem::IncrementCounter(bool New)
SetText(cString::sprintf("%d\t\t%d\t%s", totalEntries, newEntries, name));
}
void cMenuRecordingItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable)
{
if (!DisplayMenu->SetItemRecording(recording, Index, Current, Selectable, level, totalEntries, newEntries))
DisplayMenu->SetItem(Text(), Index, Current, Selectable);
}
// --- cMenuRecordings -------------------------------------------------------
cMenuRecordings::cMenuRecordings(const char *Base, int Level, bool OpenSubMenus)
@ -2224,8 +2253,7 @@ void cMenuRecordings::SetHelpKeys(void)
NewHelpKeys = 1;
else {
NewHelpKeys = 2;
cRecording *recording = GetRecording(ri);
if (recording && recording->Info()->Title())
if (ri->Recording()->Info()->Title())
NewHelpKeys = 3;
}
}
@ -2248,12 +2276,8 @@ void cMenuRecordings::Set(bool Refresh)
char *LastItemText = NULL;
cThreadLock RecordingsLock(&Recordings);
if (Refresh) {
cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
if (ri) {
cRecording *Recording = Recordings.GetByName(ri->FileName());
if (Recording)
CurrentRecording = Recording->FileName();
}
if (cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current()))
CurrentRecording = ri->Recording()->FileName();
}
Clear();
GetRecordingsSortMode(DirectoryName());
@ -2293,14 +2317,6 @@ cString cMenuRecordings::DirectoryName(void)
return d;
}
cRecording *cMenuRecordings::GetRecording(cMenuRecordingItem *Item)
{
cRecording *recording = Recordings.GetByName(Item->FileName());
if (!recording)
Skins.Message(mtError, tr("Error while accessing recording!"));
return recording;
}
bool cMenuRecordings::Open(bool OpenSubMenus)
{
cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
@ -2324,11 +2340,8 @@ eOSState cMenuRecordings::Play(void)
if (ri->IsDirectory())
Open();
else {
cRecording *recording = GetRecording(ri);
if (recording) {
cReplayControl::SetRecording(recording->FileName());
return osReplay;
}
cReplayControl::SetRecording(ri->Recording()->FileName());
return osReplay;
}
}
return osContinue;
@ -2340,13 +2353,10 @@ eOSState cMenuRecordings::Rewind(void)
return osContinue;
cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
if (ri && !ri->IsDirectory()) {
cRecording *recording = GetRecording(ri);
if (recording) {
cDevice::PrimaryDevice()->StopReplay(); // must do this first to be able to rewind the currently replayed recording
cResumeFile ResumeFile(ri->FileName(), recording->IsPesRecording());
ResumeFile.Delete();
return Play();
}
cDevice::PrimaryDevice()->StopReplay(); // must do this first to be able to rewind the currently replayed recording
cResumeFile ResumeFile(ri->Recording()->FileName(), ri->Recording()->IsPesRecording());
ResumeFile.Delete();
return Play();
}
return osContinue;
}
@ -2358,7 +2368,7 @@ eOSState cMenuRecordings::Delete(void)
cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
if (ri && !ri->IsDirectory()) {
if (Interface->Confirm(tr("Delete recording?"))) {
cRecordControl *rc = cRecordControls::GetRecordControl(ri->FileName());
cRecordControl *rc = cRecordControls::GetRecordControl(ri->Recording()->FileName());
if (rc) {
if (Interface->Confirm(tr("Timer still recording - really delete?"))) {
cTimer *timer = rc->Timer();
@ -2375,33 +2385,32 @@ eOSState cMenuRecordings::Delete(void)
else
return osContinue;
}
cRecording *recording = GetRecording(ri);
if (recording) {
if (cCutter::Active(ri->FileName())) {
if (Interface->Confirm(tr("Recording is being edited - really delete?"))) {
cCutter::Stop();
recording = Recordings.GetByName(ri->FileName()); // cCutter::Stop() might have deleted it if it was the edited version
// we continue with the code below even if recording is NULL,
// in order to have the menu updated etc.
}
else
return osContinue;
}
if (cReplayControl::NowReplaying() && strcmp(cReplayControl::NowReplaying(), ri->FileName()) == 0)
cControl::Shutdown();
if (!recording || recording->Delete()) {
cReplayControl::ClearLastReplayed(ri->FileName());
Recordings.DelByName(ri->FileName());
cOsdMenu::Del(Current());
SetHelpKeys();
cVideoDiskUsage::ForceCheck();
Display();
if (!Count())
return osBack;
cRecording *recording = ri->Recording();
cString FileName = recording->FileName();
if (cCutter::Active(ri->Recording()->FileName())) {
if (Interface->Confirm(tr("Recording is being edited - really delete?"))) {
cCutter::Stop();
recording = Recordings.GetByName(FileName); // cCutter::Stop() might have deleted it if it was the edited version
// we continue with the code below even if recording is NULL,
// in order to have the menu updated etc.
}
else
Skins.Message(mtError, tr("Error while deleting recording!"));
return osContinue;
}
if (cReplayControl::NowReplaying() && strcmp(cReplayControl::NowReplaying(), FileName) == 0)
cControl::Shutdown();
if (!recording || recording->Delete()) {
cReplayControl::ClearLastReplayed(FileName);
Recordings.DelByName(FileName);
cOsdMenu::Del(Current());
SetHelpKeys();
cVideoDiskUsage::ForceCheck();
Display();
if (!Count())
return osBack;
}
else
Skins.Message(mtError, tr("Error while deleting recording!"));
}
}
return osContinue;
@ -2412,11 +2421,8 @@ eOSState cMenuRecordings::Info(void)
if (HasSubMenu() || Count() == 0)
return osContinue;
cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
if (ri && !ri->IsDirectory()) {
cRecording *recording = GetRecording(ri);
if (recording && recording->Info()->Title())
return AddSubMenu(new cMenuRecording(recording, true));
}
if (ri && !ri->IsDirectory() && ri->Recording()->Info()->Title())
return AddSubMenu(new cMenuRecording(ri->Recording(), true));
return osContinue;
}
@ -2426,14 +2432,11 @@ eOSState cMenuRecordings::Commands(eKeys Key)
return osContinue;
cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
if (ri && !ri->IsDirectory()) {
cRecording *recording = GetRecording(ri);
if (recording) {
cMenuCommands *menu;
eOSState state = AddSubMenu(menu = new cMenuCommands(tr("Recording commands"), &RecordingCommands, cString::sprintf("\"%s\"", *strescape(recording->FileName(), "\\\"$"))));
if (Key != kNone)
state = menu->ProcessKey(Key);
return state;
}
cMenuCommands *menu;
eOSState state = AddSubMenu(menu = new cMenuCommands(tr("Recording commands"), &RecordingCommands, cString::sprintf("\"%s\"", *strescape(ri->Recording()->FileName(), "\\\"$"))));
if (Key != kNone)
state = menu->ProcessKey(Key);
return state;
}
return osContinue;
}
@ -2454,6 +2457,7 @@ eOSState cMenuRecordings::ProcessKey(eKeys Key)
if (state == osUnknown) {
switch (Key) {
case kPlayPause:
case kPlay:
case kOk: return Play();
case kRed: return (helpKeys > 1 && RecordingCommands.Count()) ? Commands() : Play();
@ -3139,6 +3143,8 @@ cMenuSetupReplay::cMenuSetupReplay(void)
Add(new cMenuEditBoolItem(tr("Setup.Replay$Multi speed mode"), &data.MultiSpeedMode));
Add(new cMenuEditBoolItem(tr("Setup.Replay$Show replay mode"), &data.ShowReplayMode));
Add(new cMenuEditBoolItem(tr("Setup.Replay$Show remaining time"), &data.ShowRemainingTime));
Add(new cMenuEditIntItem( tr("Setup.Replay$Progress display time (s)"), &data.ProgressDisplayTime, 0, 60));
Add(new cMenuEditBoolItem(tr("Setup.Replay$Pause replay when setting mark"), &data.PauseOnMarkSet));
Add(new cMenuEditIntItem(tr("Setup.Replay$Resume ID"), &data.ResumeID, 0, 99));
}
@ -4475,6 +4481,8 @@ cReplayControl::cReplayControl(bool PauseLive)
cStatus::MsgReplaying(this, Recording.Name(), Recording.FileName(), true);
marks.Load(fileName, Recording.FramesPerSecond(), Recording.IsPesRecording());
SetTrackDescriptions(false);
if (Setup.ProgressDisplayTime)
ShowTimed(Setup.ProgressDisplayTime);
}
cReplayControl::~cReplayControl()
@ -4685,6 +4693,7 @@ void cReplayControl::TimeSearchProcess(eKeys Key)
timeSearchActive = false;
}
break;
case kPlayPause:
case kPlay:
case kUp:
case kPause:
@ -4739,7 +4748,7 @@ void cReplayControl::MarkToggle(void)
marks.Add(Current);
bool Play, Forward;
int Speed;
if (GetReplayMode(Play, Forward, Speed) && !Play)
if (Setup.PauseOnMarkSet || GetReplayMode(Play, Forward, Speed) && !Play)
Goto(Current, true);
}
ShowTimed(2);
@ -4749,15 +4758,19 @@ void cReplayControl::MarkToggle(void)
void cReplayControl::MarkJump(bool Forward)
{
if (marks.Count()) {
int Current, Total;
if (GetIndex(Current, Total)) {
int Current, Total;
if (GetIndex(Current, Total)) {
if (marks.Count()) {
cMark *m = Forward ? marks.GetNext(Current) : marks.GetPrev(Current);
if (m) {
Goto(m->Position(), true);
displayFrames = true;
return;
}
}
// There are either no marks at all, or we already were at the first or last one,
// so jump to the very beginning or end:
Goto(Forward ? Total : 0, true);
}
}
@ -4861,6 +4874,15 @@ eOSState cReplayControl::ProcessKey(eKeys Key)
TimeSearchProcess(Key);
return osContinue;
}
if (Key == kPlayPause) {
bool Play, Forward;
int Speed;
GetReplayMode(Play, Forward, Speed);
if (Speed >= 0)
Key = Play ? kPlay : kPause;
else
Key = Play ? kPause : kPlay;
}
bool DoShowMode = true;
switch (int(Key)) {
// Positioning:

3
menu.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: menu.h 2.12 2012/09/07 08:48:34 kls Exp $
* $Id: menu.h 2.13 2012/12/07 13:44:13 kls Exp $
*/
#ifndef __MENU_H
@ -208,7 +208,6 @@ private:
eOSState Commands(eKeys Key = kNone);
protected:
cString DirectoryName(void);
cRecording *GetRecording(cMenuRecordingItem *Item);
public:
cMenuRecordings(const char *Base = NULL, int Level = 0, bool OpenSubMenus = false);
~cMenuRecordings();

4
osd.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: osd.h 2.17 2012/06/02 10:32:38 kls Exp $
* $Id: osd.h 2.18 2012/12/03 13:49:02 kls Exp $
*/
#ifndef __OSD_H
@ -735,7 +735,7 @@ protected:
///< Initializes the OSD with the given coordinates.
///< By default it is assumed that the full area will be able to display
///< full 32 bit graphics (ARGB with eight bit for each color and the alpha
///< value, repectively). However, the actual hardware in use may not be
///< value, respectively). However, the actual hardware in use may not be
///< able to display such a high resolution OSD, so there is an option to
///< divide the full OSD area into several sub-areas with lower color depths
///< and individual palettes. The sub-areas need not necessarily cover the

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: osdbase.c 2.6 2012/04/23 09:41:22 kls Exp $
* $Id: osdbase.c 2.7 2012/12/07 09:50:47 kls Exp $
*/
#include "osdbase.h"
@ -55,6 +55,11 @@ void cOsdItem::SetFresh(bool Fresh)
fresh = Fresh;
}
void cOsdItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable)
{
DisplayMenu->SetItem(Text(), Index, Current, Selectable);
}
eOSState cOsdItem::ProcessKey(eKeys Key)
{
return Key == kOk ? state : osUnknown;
@ -246,7 +251,7 @@ void cOsdMenu::Display(void)
int n = 0;
for (cOsdItem *item = Get(first); item; item = Next(item)) {
bool CurrentSelectable = (i == current) && item->Selectable();
displayMenu->SetItem(item->Text(), i - first, CurrentSelectable, item->Selectable());
item->SetMenuItem(displayMenu, i - first, CurrentSelectable, item->Selectable());
if (CurrentSelectable)
cStatus::MsgOsdCurrentItem(item->Text());
if (++n == displayMenuItems)
@ -275,7 +280,7 @@ void cOsdMenu::DisplayCurrent(bool Current)
{
cOsdItem *item = Get(current);
if (item) {
displayMenu->SetItem(item->Text(), current - first, Current && item->Selectable(), item->Selectable());
item->SetMenuItem(displayMenu, current - first, Current && item->Selectable(), item->Selectable());
if (Current && item->Selectable())
cStatus::MsgOsdCurrentItem(item->Text());
if (!Current)
@ -296,7 +301,7 @@ void cOsdMenu::DisplayItem(cOsdItem *Item)
int Offset = Index - first;
if (Offset >= 0 && Offset < first + displayMenuItems) {
bool Current = Index == current;
displayMenu->SetItem(Item->Text(), Offset, Current && Item->Selectable(), Item->Selectable());
Item->SetMenuItem(displayMenu, Offset, Current && Item->Selectable(), Item->Selectable());
if (Current && Item->Selectable())
cStatus::MsgOsdCurrentItem(Item->Text());
}

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: osdbase.h 2.4 2012/04/23 09:40:07 kls Exp $
* $Id: osdbase.h 2.5 2012/12/07 09:49:35 kls Exp $
*/
#ifndef __OSDBASE_H
@ -63,6 +63,7 @@ public:
void SetFresh(bool Fresh);
const char *Text(void) const { return text; }
virtual void Set(void) {}
virtual void SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable);
virtual eOSState ProcessKey(eKeys Key);
};

4
pat.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: pat.c 2.18 2012/04/15 09:54:53 kls Exp $
* $Id: pat.c 2.19 2012/11/25 14:12:21 kls Exp $
*/
#include "pat.h"
@ -352,7 +352,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
switch (stream.getStreamType()) {
case 1: // STREAMTYPE_11172_VIDEO
case 2: // STREAMTYPE_13818_VIDEO
case 0x1B: // MPEG4
case 0x1B: // H.264
Vpid = esPid;
Ppid = pmt.getPCRPid();
Vtype = stream.getStreamType();

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2008-10-16 11:16-0400\n"
"Last-Translator: Osama Alrawab <alrawab@hotmail.com>\n"
"Language-Team: Arabic <ar@li.org>\n"
@ -417,6 +417,9 @@ msgstr "ازرق"
msgid "Key$Info"
msgstr "معلومات"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "عرض"
@ -750,9 +753,6 @@ msgstr "افتح"
msgid "Commands"
msgstr "الاوامر"
msgid "Error while accessing recording!"
msgstr "حدث خطاء عند محاولة الوصول لتسجيلات"
msgid "Delete recording?"
msgstr "حذف التسجيل"
@ -1127,6 +1127,12 @@ msgstr "اضهر طور الاعادة"
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "رقم المواصلة"
@ -1412,3 +1418,6 @@ msgstr "القرص الصلب"
msgid "free"
msgstr "مساحة حرة"
#~ msgid "Error while accessing recording!"
#~ msgstr "حدث خطاء عند محاولة الوصول لتسجيلات"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2008-03-02 19:02+0100\n"
"Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
"Language-Team: Catalan <vdr@linuxtv.org>\n"
@ -413,6 +413,9 @@ msgstr "Blau"
msgid "Key$Info"
msgstr "Informació"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Reproduir"
@ -741,9 +744,6 @@ msgstr "Obrir"
msgid "Commands"
msgstr "Ordres"
msgid "Error while accessing recording!"
msgstr "Error a l'accedir a la gravació!"
msgid "Delete recording?"
msgstr "Esborrar gravació?"
@ -1104,6 +1104,12 @@ msgstr "Mostrar mode de reproducci
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID de Continuar"
@ -1386,3 +1392,6 @@ msgstr "Disc"
msgid "free"
msgstr "lliure"
#~ msgid "Error while accessing recording!"
#~ msgstr "Error a l'accedir a la gravació!"

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.14\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2010-05-06 11:00+0200\n"
"Last-Translator: Radek Šťastný <dedkus@gmail.com>\n"
"Language-Team: Czech <vdr@linuxtv.org>\n"
@ -412,6 +412,9 @@ msgstr "Modrý"
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Přehrát"
@ -740,9 +743,6 @@ msgstr "Otevřít"
msgid "Commands"
msgstr "Příkazy"
msgid "Error while accessing recording!"
msgstr "Chyba při přístupu k nahrávkám!"
msgid "Delete recording?"
msgstr "Smazat nahrávku?"
@ -1103,6 +1103,12 @@ msgstr "Zobrazit režim přehrávání"
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID obnovení"
@ -1385,3 +1391,6 @@ msgstr "Disk"
msgid "free"
msgstr "volno"
#~ msgid "Error while accessing recording!"
#~ msgstr "Chyba při přístupu k nahrávkám!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
"Language-Team: Danish <vdr@linuxtv.org>\n"
@ -410,6 +410,9 @@ msgstr "Bl
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Afspil"
@ -738,9 +741,6 @@ msgstr "
msgid "Commands"
msgstr "Kommandoer"
msgid "Error while accessing recording!"
msgstr "Fejl ved læsning af optagelse!"
msgid "Delete recording?"
msgstr "Slet optagelse?"
@ -1101,6 +1101,12 @@ msgstr "Vis afspilningsmodus"
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "Genoptagelses ID"
@ -1383,3 +1389,6 @@ msgstr "Disk"
msgid "free"
msgstr "fri"
#~ msgid "Error while accessing recording!"
#~ msgstr "Fejl ved læsning af optagelse!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2010-01-16 16:46+0100\n"
"Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n"
"Language-Team: German <vdr@linuxtv.org>\n"
@ -410,6 +410,9 @@ msgstr "Blau"
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr "Wiedergabe/Pause"
msgid "Key$Play"
msgstr "Wiedergabe"
@ -738,9 +741,6 @@ msgstr "
msgid "Commands"
msgstr "Befehle"
msgid "Error while accessing recording!"
msgstr "Fehler beim Ansprechen der Aufzeichnung!"
msgid "Delete recording?"
msgstr "Aufzeichnung löschen?"
@ -1101,6 +1101,12 @@ msgstr "Wiedergabestatus anzeigen"
msgid "Setup.Replay$Show remaining time"
msgstr "Verbleibende Zeit anzeigen"
msgid "Setup.Replay$Progress display time (s)"
msgstr "Anzeigedauer für Fortschrittsanzeige (s)"
msgid "Setup.Replay$Pause replay when setting mark"
msgstr "Pause beim Setzen einer Schnittmarke"
msgid "Setup.Replay$Resume ID"
msgstr "Wiedergabe-ID"
@ -1383,3 +1389,6 @@ msgstr "Disk"
msgid "free"
msgstr "frei"
#~ msgid "Error while accessing recording!"
#~ msgstr "Fehler beim Ansprechen der Aufzeichnung!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
"Language-Team: Greek <vdr@linuxtv.org>\n"
@ -410,6 +410,9 @@ msgstr "
msgid "Key$Info"
msgstr "Ðëçñïöïñßåò"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "ÁíáðáñáãùãÞ"
@ -738,9 +741,6 @@ msgstr "
msgid "Commands"
msgstr "ÅíôïëÝò"
msgid "Error while accessing recording!"
msgstr "Ðñüâëçìá óôÞí ðñïóðÝëáóç åããñáöÞò!"
msgid "Delete recording?"
msgstr "ÄéáãñáöÞ åããñáöÞò?"
@ -1101,6 +1101,12 @@ msgstr "
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID áíáìåôÜäïóçò"
@ -1383,3 +1389,6 @@ msgstr "
msgid "free"
msgstr "Åëåýèåñïò"
#~ msgid "Error while accessing recording!"
#~ msgstr "Ðñüâëçìá óôÞí ðñïóðÝëáóç åããñáöÞò!"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2008-03-02 19:02+0100\n"
"Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
"Language-Team: Spanish <vdr@linuxtv.org>\n"
@ -411,6 +411,9 @@ msgstr "Azul"
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Reproducir"
@ -739,9 +742,6 @@ msgstr "Abrir"
msgid "Commands"
msgstr "Órdenes"
msgid "Error while accessing recording!"
msgstr "¡Error al acceder a la grabación!"
msgid "Delete recording?"
msgstr "¿Eliminar grabacion?"
@ -1102,6 +1102,12 @@ msgstr "Mostrar modo de reproducci
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID de continuación"
@ -1384,3 +1390,6 @@ msgstr "Disco"
msgid "free"
msgstr "libre"
#~ msgid "Error while accessing recording!"
#~ msgstr "¡Error al acceder a la grabación!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
"Language-Team: Estonian <vdr@linuxtv.org>\n"
@ -410,6 +410,9 @@ msgstr "Sinine"
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Start"
@ -738,9 +741,6 @@ msgstr "Avada"
msgid "Commands"
msgstr "Käsud"
msgid "Error while accessing recording!"
msgstr "Salvestuse taasesitus nurjus!"
msgid "Delete recording?"
msgstr "Kustutada salvestus?"
@ -1101,6 +1101,12 @@ msgstr "Korduse režiimi kuvamine"
msgid "Setup.Replay$Show remaining time"
msgstr "Järelejäänud aja kuvamine"
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "Jätkamise ID"
@ -1383,3 +1389,6 @@ msgstr "Ketas"
msgid "free"
msgstr "vaba"
#~ msgid "Error while accessing recording!"
#~ msgstr "Salvestuse taasesitus nurjus!"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2007-08-15 15:52+0200\n"
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
"Language-Team: Finnish <vdr@linuxtv.org>\n"
@ -413,6 +413,9 @@ msgstr "Sininen"
msgid "Key$Info"
msgstr "Tiedot"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Toista"
@ -741,9 +744,6 @@ msgstr "Avaa"
msgid "Commands"
msgstr "Komennot"
msgid "Error while accessing recording!"
msgstr "Tallenteen toistaminen epäonnistui!"
msgid "Delete recording?"
msgstr "Poistetaanko tallenne?"
@ -1104,6 +1104,12 @@ msgstr "Näytä toiston tila"
msgid "Setup.Replay$Show remaining time"
msgstr "Näytä jäljellä oleva aika"
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "Tallenteen paluutunniste"
@ -1386,3 +1392,6 @@ msgstr "Levy"
msgid "free"
msgstr "vapaana"
#~ msgid "Error while accessing recording!"
#~ msgstr "Tallenteen toistaminen epäonnistui!"

View File

@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2008-02-27 18:14+0100\n"
"Last-Translator: Jean-Claude Repetto <jc@repetto.org>\n"
"Language-Team: French <vdr@linuxtv.org>\n"
@ -416,6 +416,9 @@ msgstr "Bleu"
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Lecture"
@ -744,9 +747,6 @@ msgstr "Ouvrir"
msgid "Commands"
msgstr "Commandes"
msgid "Error while accessing recording!"
msgstr "Impossible d'accéder à l'enregistrement"
msgid "Delete recording?"
msgstr "Supprimer l'enregistrement ?"
@ -1107,6 +1107,12 @@ msgstr "Affichage mode de lecture"
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID de reprise"
@ -1389,3 +1395,6 @@ msgstr "Disque"
msgid "free"
msgstr "restant"
#~ msgid "Error while accessing recording!"
#~ msgstr "Impossible d'accéder à l'enregistrement"

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2008-03-17 19:00+0100\n"
"Last-Translator: Adrian Caval <anrxc@sysphere.org>\n"
"Language-Team: Croatian <vdr@linuxtv.org>\n"
@ -412,6 +412,9 @@ msgstr "Plavo"
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Start"
@ -740,9 +743,6 @@ msgstr "Otvori"
msgid "Commands"
msgstr "Naredbe"
msgid "Error while accessing recording!"
msgstr "Gre¹ka pri pristupanju snimke!"
msgid "Delete recording?"
msgstr "Obrisati snimku?"
@ -1103,6 +1103,12 @@ msgstr "Prika
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID nastavka"
@ -1385,3 +1391,6 @@ msgstr "Disk"
msgid "free"
msgstr "slobodno"
#~ msgid "Error while accessing recording!"
#~ msgstr "Gre¹ka pri pristupanju snimke!"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2012-01-02 11:54+0200\n"
"Last-Translator: István Füley <ifuley@tigercomp.ro>\n"
"Language-Team: Hungarian <vdr@linuxtv.org>\n"
@ -413,6 +413,9 @@ msgstr "K
msgid "Key$Info"
msgstr "Információ"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Lejátszás"
@ -741,9 +744,6 @@ msgstr "Kinyitni"
msgid "Commands"
msgstr "Parancsok"
msgid "Error while accessing recording!"
msgstr "Hiba a felvétel hozzáférésénél"
msgid "Delete recording?"
msgstr "Felvétel törlése?"
@ -1105,6 +1105,12 @@ msgstr "Lej
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "Lejátszás ID"
@ -1387,3 +1393,6 @@ msgstr "Lemez"
msgid "free"
msgstr "szabad"
#~ msgid "Error while accessing recording!"
#~ msgstr "Hiba a felvétel hozzáférésénél"

View File

@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2012-06-06 22:50+0100\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: Italian <vdr@linuxtv.org>\n"
@ -417,6 +417,9 @@ msgstr "Blu"
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Riproduci"
@ -745,9 +748,6 @@ msgstr "Apri"
msgid "Commands"
msgstr "Comandi"
msgid "Error while accessing recording!"
msgstr "Errore accesso alla registrazione!"
msgid "Delete recording?"
msgstr "Eliminare la registrazione?"
@ -1108,6 +1108,12 @@ msgstr "Mostra modalità riproduzione"
msgid "Setup.Replay$Show remaining time"
msgstr "Mostra tempo rimanente"
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID di ripristino"
@ -1390,3 +1396,6 @@ msgstr "Disco"
msgid "free"
msgstr "disponibili"
#~ msgid "Error while accessing recording!"
#~ msgstr "Errore accesso alla registrazione!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.16\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2010-10-30 11:55+0200\n"
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
@ -410,6 +410,9 @@ msgstr "Mėlyna"
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Grona"
@ -738,9 +741,6 @@ msgstr "Atidaryti"
msgid "Commands"
msgstr "Komandos"
msgid "Error while accessing recording!"
msgstr "Klaida atidarant įrašą!"
msgid "Delete recording?"
msgstr "Ištrinti įrašą?"
@ -1101,6 +1101,12 @@ msgstr "Rodyti pakartojimo ręžimą"
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "Kūrinio ID"
@ -1383,3 +1389,6 @@ msgstr "Diskas"
msgid "free"
msgstr "laisva"
#~ msgid "Error while accessing recording!"
#~ msgstr "Klaida atidarant įrašą!"

View File

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR-1.7.14\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"PO-Revision-Date: 2010-03-11 00:54+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2012-11-19 15:18+0100\n"
"Last-Translator: Dimitar Petrovski <dimeptr@gmail.com>\n"
"Language-Team: Macedonian <en@li.org>\n"
"Language: mk\n"
@ -75,7 +75,7 @@ msgid "Rolloff"
msgstr "Рол-оф"
msgid "PlpId"
msgstr ""
msgstr "PlpId"
msgid "Starting EPG scan"
msgstr "Започнувам скенирање на EPG"
@ -411,6 +411,9 @@ msgstr "Сино"
msgid "Key$Info"
msgstr "Инфо"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Старт"
@ -644,10 +647,10 @@ msgid "Button$Folder"
msgstr "Директориум"
msgid "Button$Single"
msgstr ""
msgstr "Единчен"
msgid "Button$Repeating"
msgstr ""
msgstr "Периодичен"
msgid "First day"
msgstr "Прв ден"
@ -739,14 +742,11 @@ msgstr "Отвори"
msgid "Commands"
msgstr "Наредби"
msgid "Error while accessing recording!"
msgstr "Грешка при пристап до снимката!"
msgid "Delete recording?"
msgstr "Избриши снимка?"
msgid "Recording is being edited - really delete?"
msgstr ""
msgstr "Снимката се уредува - бриши?"
msgid "Error while deleting recording!"
msgstr "Грешка при бришење на снимката!"
@ -848,19 +848,19 @@ msgid "Setup.OSD$Folders in timer menu"
msgstr "Директориуми во менито за тајмер"
msgid "Setup.OSD$Number keys for characters"
msgstr ""
msgstr "Нумерички копчиња за букви"
msgid "Setup.OSD$Color key 0"
msgstr ""
msgstr "Копче во боја 0"
msgid "Setup.OSD$Color key 1"
msgstr ""
msgstr "Копче во боја 1"
msgid "Setup.OSD$Color key 2"
msgstr ""
msgstr "Копче во боја 2"
msgid "Setup.OSD$Color key 3"
msgstr ""
msgstr "Копче во боја 3"
msgid "EPG"
msgstr "EPG (електронски водич на програми)"
@ -931,7 +931,7 @@ msgid "Setup.DVB$Primary DVB interface"
msgstr "Примарен DVB уред"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgstr "Согласност со стандард"
msgid "Setup.DVB$Video format"
msgstr "Видео формат"
@ -986,10 +986,10 @@ msgstr "Форна LNB фрекфенција (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgstr "Уред %d поврзан со сателитски кабел"
msgid "Setup.LNB$own"
msgstr ""
msgstr "свој"
msgid "CAM reset"
msgstr "Рестартирај CAM"
@ -1079,7 +1079,7 @@ msgid "Setup.Recording$Instant rec. time (min)"
msgstr "Траење на директно снимање (мин)"
msgid "Setup.Recording$present event"
msgstr ""
msgstr "сегашен настан"
msgid "Setup.Recording$Max. video file size (MB)"
msgstr "Максимална големина на датотека (MB)"
@ -1100,6 +1100,12 @@ msgid "Setup.Replay$Show replay mode"
msgstr "Прикажи начин на пуштање"
msgid "Setup.Replay$Show remaining time"
msgstr "Прикажи преостанато време"
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
@ -1136,7 +1142,7 @@ msgid "Setup.Miscellaneous$Channels wrap"
msgstr "Премотување канали"
msgid "Setup.Miscellaneous$Show channel names with source"
msgstr ""
msgstr "Прикажи имиња на канали со извор"
msgid "Setup.Miscellaneous$Emergency exit"
msgstr "Итен излез"
@ -1215,7 +1221,7 @@ msgid "No editing marks defined!"
msgstr "Нема одредено ознаки за сечење!"
msgid "No editing sequences defined!"
msgstr ""
msgstr "Нема одредено секвенци за уредување!"
msgid "Can't start editing process!"
msgstr "Не може да почне уредување!"
@ -1260,7 +1266,7 @@ msgid "Index file regeneration complete"
msgstr "Регенерирањето на индексот заврши"
msgid "Index file regeneration failed!"
msgstr ""
msgstr "Регенерирањето на индексот е неуспешен!"
msgid "Can't shutdown - option '-s' not given!"
msgstr "Невозможно гаснење - недостасува опцијата '-s'!"
@ -1299,22 +1305,22 @@ msgid "Classic VDR"
msgstr "Класичен VDR"
msgid "DISK"
msgstr ""
msgstr "ДИСК"
msgid "LOAD"
msgstr ""
msgstr "ТОВАР"
msgid "TIMERS"
msgstr ""
msgstr "ТАЈМЕР"
msgid "DEVICES"
msgstr ""
msgstr "УРЕДИ"
msgid "LIVE"
msgstr ""
msgstr "ЖИВО"
msgid "PLAY"
msgstr ""
msgstr "ПУШТИ"
msgid "ST:TNG Panels"
msgstr "ST:TNG Панели"
@ -1384,3 +1390,6 @@ msgstr "Диск"
msgid "free"
msgstr "слободен"
#~ msgid "Error while accessing recording!"
#~ msgstr "Грешка при пристап до снимката!"

View File

@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2008-02-26 17:20+0100\n"
"Last-Translator: Johan Schuring <johan.schuring@vetteblei.nl>\n"
"Language-Team: Dutch <vdr@linuxtv.org>\n"
@ -414,6 +414,9 @@ msgstr "Blauw"
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Weergeven"
@ -742,9 +745,6 @@ msgstr "Openen"
msgid "Commands"
msgstr "Commando's"
msgid "Error while accessing recording!"
msgstr "Fout bij lezen opname!"
msgid "Delete recording?"
msgstr "Opname verwijderen?"
@ -1105,6 +1105,12 @@ msgstr "Weergave mode aangeven"
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "Hervattings ID"
@ -1387,3 +1393,6 @@ msgstr "Schijf"
msgid "free"
msgstr "vrij"
#~ msgid "Error while accessing recording!"
#~ msgstr "Fout bij lezen opname!"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
"Language-Team: Norwegian Nynorsk <vdr@linuxtv.org>\n"
@ -411,6 +411,9 @@ msgstr "Bl
msgid "Key$Info"
msgstr ""
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr ""
@ -739,9 +742,6 @@ msgstr "
msgid "Commands"
msgstr "Kommandoer"
msgid "Error while accessing recording!"
msgstr "Feil under lesing av opptak!"
msgid "Delete recording?"
msgstr "Slette opptak?"
@ -1102,6 +1102,12 @@ msgstr "Vis avspillingsmodus"
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "Resume ID"
@ -1384,3 +1390,6 @@ msgstr "Disk"
msgid "free"
msgstr "ledig"
#~ msgid "Error while accessing recording!"
#~ msgstr "Feil under lesing av opptak!"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2008-03-09 12:59+0100\n"
"Last-Translator: Michael Rakowski <mrak@gmx.de>\n"
"Language-Team: Polish <vdr@linuxtv.org>\n"
@ -411,6 +411,9 @@ msgstr "Niebieski"
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Odtwórz"
@ -739,9 +742,6 @@ msgstr "Otw
msgid "Commands"
msgstr "Polecenia"
msgid "Error while accessing recording!"
msgstr "Bl±d podczas dostêpu do nagrania!"
msgid "Delete recording?"
msgstr "Usun±æ nagranie?"
@ -1102,6 +1102,12 @@ msgstr "Pokazuj tryb odtwarzania"
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID wznowienia"
@ -1384,3 +1390,6 @@ msgstr "Dysk"
msgid "free"
msgstr "wolnego"
#~ msgid "Error while accessing recording!"
#~ msgstr "Bl±d podczas dostêpu do nagrania!"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.15\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2010-03-28 22:49+0100\n"
"Last-Translator: Cris Silva <hudokkow@gmail.com>\n"
"Language-Team: Portuguese <vdr@linuxtv.org>\n"
@ -411,6 +411,9 @@ msgstr "Azul"
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Reproduzir"
@ -739,9 +742,6 @@ msgstr "Abrir"
msgid "Commands"
msgstr "Comandos"
msgid "Error while accessing recording!"
msgstr "Erro a aceder às gravações!"
msgid "Delete recording?"
msgstr "Eliminar gravação?"
@ -1102,6 +1102,12 @@ msgstr "Mostrar modo de reprodu
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID de resumo"
@ -1384,3 +1390,6 @@ msgstr "Disco"
msgid "free"
msgstr "livre"
#~ msgid "Error while accessing recording!"
#~ msgstr "Erro a aceder às gravações!"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.12\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2012-11-05 01:28+0100\n"
"Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
"Language-Team: Romanian <vdr@linuxtv.org>\n"
@ -413,6 +413,9 @@ msgstr "Albastru"
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Redare"
@ -741,9 +744,6 @@ msgstr "Deschide"
msgid "Commands"
msgstr "Comenzi"
msgid "Error while accessing recording!"
msgstr "Eroare la accesarea înregistrării"
msgid "Delete recording?"
msgstr "Şterg înregistrarea?"
@ -1104,6 +1104,12 @@ msgstr "Afişează redarea"
msgid "Setup.Replay$Show remaining time"
msgstr "Arată timpul rămas"
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "Identificator continuare"
@ -1386,3 +1392,6 @@ msgstr "Disc"
msgid "free"
msgstr "liber"
#~ msgid "Error while accessing recording!"
#~ msgstr "Eroare la accesarea înregistrării"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2008-12-15 14:37+0100\n"
"Last-Translator: Oleg Roitburd <oleg@roitburd.de>\n"
"Language-Team: Russian <vdr@linuxtv.org>\n"
@ -411,6 +411,9 @@ msgstr "
msgid "Key$Info"
msgstr "¸ÝäÞ"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "²ÞáßàÞØ×ÒÕÔÕÝØÕ"
@ -739,9 +742,6 @@ msgstr "
msgid "Commands"
msgstr "ºÞÜÐÝÔë"
msgid "Error while accessing recording!"
msgstr "¾èØÑÚÐ ÔÞáâãßÐ Ú ×ÐßØáØ!"
msgid "Delete recording?"
msgstr "ÁâÕàÕâì ×ÐßØáì?"
@ -1102,6 +1102,12 @@ msgstr "
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID ÒÞáßàÞØ×ÒÕÔÕÝØï"
@ -1384,3 +1390,6 @@ msgstr "
msgid "free"
msgstr "áÒÞÑÞÔÝÞ"
#~ msgid "Error while accessing recording!"
#~ msgstr "¾èØÑÚÐ ÔÞáâãßÐ Ú ×ÐßØáØ!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.16\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2011-02-15 16:29+0100\n"
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
"Language-Team: Slovak <vdr@linuxtv.org>\n"
@ -410,6 +410,9 @@ msgstr "Modr
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Prehra»"
@ -738,9 +741,6 @@ msgstr "Otvori
msgid "Commands"
msgstr "Príkazy"
msgid "Error while accessing recording!"
msgstr "Chyba pri prístupe k nahrávkam!"
msgid "Delete recording?"
msgstr "Zmaza» nahrávku?"
@ -1101,6 +1101,12 @@ msgstr "Zobrazi
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID obnovenie"
@ -1383,3 +1389,6 @@ msgstr "Disk"
msgid "free"
msgstr "volne"
#~ msgid "Error while accessing recording!"
#~ msgstr "Chyba pri prístupe k nahrávkam!"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2008-02-28 19:44+0100\n"
"Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
"Language-Team: Slovenian <vdr@linuxtv.org>\n"
@ -411,6 +411,9 @@ msgstr "Modra"
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Predvajaj"
@ -739,9 +742,6 @@ msgstr "Odpri"
msgid "Commands"
msgstr "Ukazi"
msgid "Error while accessing recording!"
msgstr "Napaka pri dostopu do posnetka!"
msgid "Delete recording?"
msgstr "Izbri¹i posnetek?"
@ -1102,6 +1102,12 @@ msgstr "Prika
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID za predvajanje"
@ -1384,3 +1390,6 @@ msgstr "Disk"
msgid "free"
msgstr "prosto"
#~ msgid "Error while accessing recording!"
#~ msgstr "Napaka pri dostopu do posnetka!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.1\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2011-01-09 15:57+0100\n"
"Last-Translator: Milan Cvijanoviæ <elcom_cvijo@hotmail.com>\n"
"Language-Team: Serbian <vdr@linuxtv.org>\n"
@ -412,6 +412,9 @@ msgstr "Plavo"
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Start"
@ -747,9 +750,6 @@ msgstr "Meni"
msgid "Commands"
msgstr "Naredbe"
msgid "Error while accessing recording!"
msgstr "Gre¹ka prilikom pristupa snimanju!"
msgid "Delete recording?"
msgstr "Obri¹i snimku?"
@ -1124,6 +1124,12 @@ msgstr "Prika
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID nastavka"
@ -1410,3 +1416,6 @@ msgstr "Disk"
msgid "free"
msgstr "slobodno"
#~ msgid "Error while accessing recording!"
#~ msgstr "Gre¹ka prilikom pristupa snimanju!"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2008-03-12 18:25+0100\n"
"Last-Translator: Magnus Andersson <svankan@bahnhof.se>\n"
"Language-Team: Swedish <vdr@linuxtv.org>\n"
@ -413,6 +413,9 @@ msgstr "Bl
msgid "Key$Info"
msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Spela upp"
@ -741,9 +744,6 @@ msgstr "
msgid "Commands"
msgstr "Kommandon"
msgid "Error while accessing recording!"
msgstr "Inspelningen går inte att läsa!"
msgid "Delete recording?"
msgstr "Ta bort inspelningen?"
@ -1104,6 +1104,12 @@ msgstr "Visa uppspelningsl
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "Återuppta ID"
@ -1386,3 +1392,6 @@ msgstr "Disk"
msgid "free"
msgstr "ledigt"
#~ msgid "Error while accessing recording!"
#~ msgstr "Inspelningen går inte att läsa!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2008-02-28 00:33+0100\n"
"Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n"
"Language-Team: Turkish <vdr@linuxtv.org>\n"
@ -410,6 +410,9 @@ msgstr "Mavi"
msgid "Key$Info"
msgstr "Bilgi"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Göster"
@ -738,9 +741,6 @@ msgstr "A
msgid "Commands"
msgstr "Komutlar"
msgid "Error while accessing recording!"
msgstr "Kayýt okuma hatasý!"
msgid "Delete recording?"
msgstr "Kayýtý sil?"
@ -1101,6 +1101,12 @@ msgstr "G
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "Gösteriþ ID'si"
@ -1383,3 +1389,6 @@ msgstr "Disk"
msgid "free"
msgstr "boþ"
#~ msgid "Error while accessing recording!"
#~ msgstr "Kayýt okuma hatasý!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2010-04-25 16:35+0200\n"
"Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n"
"Language-Team: Ukrainian <vdr@linuxtv.org>\n"
@ -410,6 +410,9 @@ msgstr "Синя"
msgid "Key$Info"
msgstr "Інфо"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "Програвання"
@ -738,9 +741,6 @@ msgstr "Відкрити"
msgid "Commands"
msgstr "Команди"
msgid "Error while accessing recording!"
msgstr "Помилка доступу до запису!"
msgid "Delete recording?"
msgstr "Витерти запис?"
@ -1101,6 +1101,12 @@ msgstr "Віображати режим перегляду"
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID продовження"
@ -1383,3 +1389,6 @@ msgstr "Диск"
msgid "free"
msgstr "вільно"
#~ msgid "Error while accessing recording!"
#~ msgstr "Помилка доступу до запису!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-11-18 14:31+0100\n"
"POT-Creation-Date: 2012-12-07 14:59+0100\n"
"PO-Revision-Date: 2009-09-23 23:50+0800\n"
"Last-Translator: Nan Feng <nfgx@21cn.com>\n"
"Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
@ -413,6 +413,9 @@ msgstr "蓝"
msgid "Key$Info"
msgstr "信息"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play"
msgstr "播放"
@ -741,9 +744,6 @@ msgstr "打开"
msgid "Commands"
msgstr "常用操作命令"
msgid "Error while accessing recording!"
msgstr "存取录像错误!"
msgid "Delete recording?"
msgstr "是否删除录像?"
@ -1104,6 +1104,12 @@ msgstr "显示回放模式"
msgid "Setup.Replay$Show remaining time"
msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "恢复 ID"
@ -1386,3 +1392,6 @@ msgstr "硬盘已使用"
msgid "free"
msgstr "可录像时间"
#~ msgid "Error while accessing recording!"
#~ msgstr "存取录像错误!"

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: recording.c 2.73 2012/11/13 13:46:49 kls Exp $
* $Id: recording.c 2.78 2012/12/06 09:35:13 kls Exp $
*/
#include "recording.h"
@ -455,7 +455,7 @@ bool cRecordingInfo::Read(FILE *f)
}
}
break;
case 'F': framesPerSecond = atof(t);
case 'F': framesPerSecond = atod(t);
break;
case 'L': lifetime = atoi(t);
break;
@ -482,7 +482,7 @@ bool cRecordingInfo::Write(FILE *f, const char *Prefix) const
if (channelID.Valid())
fprintf(f, "%sC %s%s%s\n", Prefix, *channelID.ToString(), channelName ? " " : "", channelName ? channelName : "");
event->Dump(f, Prefix, true);
fprintf(f, "%sF %.10g\n", Prefix, framesPerSecond);
fprintf(f, "%sF %s\n", Prefix, *dtoa(framesPerSecond, "%.10g"));
fprintf(f, "%sP %d\n", Prefix, priority);
fprintf(f, "%sL %d\n", Prefix, lifetime);
if (aux)
@ -691,7 +691,8 @@ cRecording::cRecording(const char *FileName)
FileName = fileName = strdup(FileName);
if (*(fileName + strlen(fileName) - 1) == '/')
*(fileName + strlen(fileName) - 1) = 0;
FileName += strlen(VideoDirectory) + 1;
if (strstr(FileName, VideoDirectory) == FileName)
FileName += strlen(VideoDirectory) + 1;
const char *p = strrchr(FileName, '/');
name = NULL;
@ -1498,8 +1499,11 @@ int cMarks::GetNumSequences(void)
NumSequences++;
BeginMark = GetNextBegin(EndMark);
}
if (NumSequences == 0 && BeginMark->Position() > 0)
NumSequences = 1; // there is only one actual "begin" mark at a non-zero offset, and no actual "end" mark
if (BeginMark) {
NumSequences++; // the last sequence had no actual "end" mark
if (NumSequences == 1 && BeginMark->Position() == 0)
NumSequences = 0; // there is only one actual "begin" mark at offset zero, and no actual "end" mark
}
}
return NumSequences;
}
@ -1606,7 +1610,7 @@ void cIndexFileGenerator::Action(void)
int Pid = TsPid(p);
if (Pid == PATPID)
PatPmtParser.ParsePat(p, TS_SIZE);
else if (Pid == PatPmtParser.PmtPid())
else if (PatPmtParser.IsPmtPid(Pid))
PatPmtParser.ParsePmt(p, TS_SIZE);
Length -= TS_SIZE;
p += TS_SIZE;
@ -1639,6 +1643,14 @@ void cIndexFileGenerator::Action(void)
}
if (IndexFileComplete) {
if (IndexFileWritten) {
cRecordingInfo RecordingInfo(recordingName);
if (RecordingInfo.Read()) {
if (FrameDetector.FramesPerSecond() > 0 && !DoubleEqual(RecordingInfo.FramesPerSecond(), FrameDetector.FramesPerSecond())) {
RecordingInfo.SetFramesPerSecond(FrameDetector.FramesPerSecond());
RecordingInfo.Write();
Recordings.UpdateByName(recordingName);
}
}
Skins.QueueMessage(mtInfo, tr("Index file regeneration complete"));
return;
}
@ -2132,7 +2144,7 @@ bool cFileName::GetLastPatPmtVersions(int &PatVersion, int &PmtVersion)
int Pid = TsPid(buf);
if (Pid == PATPID)
PatPmtParser.ParsePat(buf, sizeof(buf));
else if (Pid == PatPmtParser.PmtPid()) {
else if (PatPmtParser.IsPmtPid(Pid)) {
PatPmtParser.ParsePmt(buf, sizeof(buf));
if (PatPmtParser.GetVersions(PatVersion, PmtVersion)) {
close(fd);

45
remux.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: remux.c 2.71 2012/11/18 12:18:08 kls Exp $
* $Id: remux.c 2.73 2012/11/25 14:16:11 kls Exp $
*/
#include "remux.h"
@ -574,7 +574,7 @@ void cPatPmtParser::Reset(void)
{
pmtSize = 0;
patVersion = pmtVersion = -1;
pmtPid = -1;
pmtPids[0] = 0;
vpid = vtype = 0;
ppid = 0;
}
@ -594,14 +594,17 @@ void cPatPmtParser::ParsePat(const uchar *Data, int Length)
dbgpatpmt("PAT: TSid = %d, c/n = %d, v = %d, s = %d, ls = %d\n", Pat.getTransportStreamId(), Pat.getCurrentNextIndicator(), Pat.getVersionNumber(), Pat.getSectionNumber(), Pat.getLastSectionNumber());
if (patVersion == Pat.getVersionNumber())
return;
int NumPmtPids = 0;
SI::PAT::Association assoc;
for (SI::Loop::Iterator it; Pat.associationLoop.getNext(assoc, it); ) {
dbgpatpmt(" isNITPid = %d\n", assoc.isNITPid());
if (!assoc.isNITPid()) {
pmtPid = assoc.getPid();
if (NumPmtPids <= MAX_PMT_PIDS)
pmtPids[NumPmtPids++] = assoc.getPid();
dbgpatpmt(" service id = %d, pid = %d\n", assoc.getServiceId(), assoc.getPid());
}
}
pmtPids[NumPmtPids] = 0;
patVersion = Pat.getVersionNumber();
}
else
@ -673,7 +676,7 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
switch (stream.getStreamType()) {
case 0x01: // STREAMTYPE_11172_VIDEO
case 0x02: // STREAMTYPE_13818_VIDEO
case 0x1B: // MPEG4
case 0x1B: // H.264
vpid = stream.getPid();
vtype = stream.getStreamType();
ppid = Pmt.getPCRPid();
@ -839,7 +842,7 @@ bool cPatPmtParser::ParsePatPmt(const uchar *Data, int Length)
int Pid = TsPid(Data);
if (Pid == PATPID)
ParsePat(Data, TS_SIZE);
else if (Pid == PmtPid()) {
else if (IsPmtPid(Pid)) {
ParsePmt(Data, TS_SIZE);
if (patVersion >= 0 && pmtVersion >= 0)
return true;
@ -1107,9 +1110,9 @@ int cMpeg2Parser::Parse(const uchar *Data, int Length, int Pid)
return tsPayload.Used();
}
// --- cMpeg4Parser ----------------------------------------------------------
// --- cH264Parser -----------------------------------------------------------
class cMpeg4Parser : public cFrameParser {
class cH264Parser : public cFrameParser {
private:
enum eNalUnitType {
nutCodedSliceNonIdr = 1,
@ -1141,14 +1144,14 @@ private:
void ParseSequenceParameterSet(void);
void ParseSliceHeader(void);
public:
cMpeg4Parser(void);
///< Sets up a new MPEG-4 parser.
cH264Parser(void);
///< Sets up a new H.264 parser.
///< This class parses only the data absolutely necessary to determine the
///< frame borders and field count of the given H264 material.
virtual int Parse(const uchar *Data, int Length, int Pid);
};
cMpeg4Parser::cMpeg4Parser(void)
cH264Parser::cH264Parser(void)
{
byte = 0;
bit = -1;
@ -1161,7 +1164,7 @@ cMpeg4Parser::cMpeg4Parser(void)
gotSequenceParameterSet = false;
}
uchar cMpeg4Parser::GetByte(bool Raw)
uchar cH264Parser::GetByte(bool Raw)
{
uchar b = tsPayload.GetByte();
if (!Raw) {
@ -1180,7 +1183,7 @@ uchar cMpeg4Parser::GetByte(bool Raw)
return b;
}
uchar cMpeg4Parser::GetBit(void)
uchar cH264Parser::GetBit(void)
{
if (bit < 0) {
byte = GetByte();
@ -1189,7 +1192,7 @@ uchar cMpeg4Parser::GetBit(void)
return (byte & (1 << bit--)) ? 1 : 0;
}
uint32_t cMpeg4Parser::GetBits(int Bits)
uint32_t cH264Parser::GetBits(int Bits)
{
uint32_t b = 0;
while (Bits--)
@ -1197,7 +1200,7 @@ uint32_t cMpeg4Parser::GetBits(int Bits)
return b;
}
uint32_t cMpeg4Parser::GetGolombUe(void)
uint32_t cH264Parser::GetGolombUe(void)
{
int z = -1;
for (int b = 0; !b; z++)
@ -1205,7 +1208,7 @@ uint32_t cMpeg4Parser::GetGolombUe(void)
return (1 << z) - 1 + GetBits(z);
}
int32_t cMpeg4Parser::GetGolombSe(void)
int32_t cH264Parser::GetGolombSe(void)
{
uint32_t v = GetGolombUe();
if (v) {
@ -1217,7 +1220,7 @@ int32_t cMpeg4Parser::GetGolombSe(void)
return v;
}
int cMpeg4Parser::Parse(const uchar *Data, int Length, int Pid)
int cH264Parser::Parse(const uchar *Data, int Length, int Pid)
{
newFrame = independentFrame = false;
tsPayload.Setup(const_cast<uchar *>(Data), Length, Pid);
@ -1257,14 +1260,14 @@ int cMpeg4Parser::Parse(const uchar *Data, int Length, int Pid)
return tsPayload.Used();
}
void cMpeg4Parser::ParseAccessUnitDelimiter(void)
void cH264Parser::ParseAccessUnitDelimiter(void)
{
if (debug && gotSequenceParameterSet)
dbgframes("A");
GetByte(); // primary_pic_type
}
void cMpeg4Parser::ParseSequenceParameterSet(void)
void cH264Parser::ParseSequenceParameterSet(void)
{
uchar profile_idc = GetByte(); // profile_idc
GetByte(); // constraint_set[0-5]_flags, reserved_zero_2bits
@ -1316,7 +1319,7 @@ void cMpeg4Parser::ParseSequenceParameterSet(void)
}
}
void cMpeg4Parser::ParseSliceHeader(void)
void cH264Parser::ParseSliceHeader(void)
{
newFrame = true;
GetGolombUe(); // first_mb_in_slice
@ -1366,13 +1369,13 @@ void cFrameDetector::SetPid(int Pid, int Type)
{
pid = Pid;
type = Type;
isVideo = type == 0x01 || type == 0x02 || type == 0x1B; // MPEG 1, 2 or 4
isVideo = type == 0x01 || type == 0x02 || type == 0x1B; // MPEG 1, 2 or H.264
delete parser;
parser = NULL;
if (type == 0x01 || type == 0x02)
parser = new cMpeg2Parser;
else if (type == 0x1B)
parser = new cMpeg4Parser;
parser = new cH264Parser;
else if (type == 0x04 || type == 0x06) // MPEG audio or AC3 audio
parser = new cAudioParser;
else if (type != 0)

12
remux.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: remux.h 2.35 2012/11/18 12:17:23 kls Exp $
* $Id: remux.h 2.36 2012/11/19 10:22:28 kls Exp $
*/
#ifndef __REMUX_H
@ -327,13 +327,15 @@ public:
// PAT/PMT Parser:
#define MAX_PMT_PIDS 32
class cPatPmtParser {
private:
uchar pmt[MAX_SECTION_SIZE];
int pmtSize;
int patVersion;
int pmtVersion;
int pmtPid;
int pmtPids[MAX_PMT_PIDS + 1]; // list is zero-terminated
int vpid;
int ppid;
int vtype;
@ -373,9 +375,9 @@ public:
bool GetVersions(int &PatVersion, int &PmtVersion) const;
///< Returns true if a valid PAT/PMT has been parsed and stores
///< the current version numbers in the given variables.
int PmtPid(void) const { return pmtPid; }
///< Returns the PMT pid as defined by the current PAT.
///< If no PAT has been received yet, -1 will be returned.
bool IsPmtPid(int Pid) const { for (int i = 0; pmtPids[i]; i++) if (pmtPids[i] == Pid) return true; return false; }
///< Returns true if Pid the one of the PMT pids as defined by the current PAT.
///< If no PAT has been received yet, false will be returned.
int Vpid(void) const { return vpid; }
///< Returns the video pid as defined by the current PMT, or 0 if no video
///< pid has been detected, yet.

49
skins.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: skins.h 2.5 2012/05/12 11:10:30 kls Exp $
* $Id: skins.h 2.7 2012/12/07 17:18:44 kls Exp $
*/
#ifndef __SKINS_H
@ -17,6 +17,7 @@
#include "recording.h"
#include "themes.h"
#include "thread.h"
#include "timers.h"
#include "tools.h"
enum eMessageType { mtStatus = 0, mtInfo, mtWarning, mtError }; // will be used to calculate color offsets!
@ -49,7 +50,7 @@ public:
class cSkinDisplayChannel : public cSkinDisplay {
///< This class is used to display the current channel, together with
///< the present and following EPG even. How and to what extent this
///< the present and following EPG event. How and to what extent this
///< is done is totally up to the derived class.
public:
virtual void SetChannel(const cChannel *Channel, int Number) = 0;
@ -152,13 +153,43 @@ public:
///< this function will be first called for the old current item
///< with Current set to false, and then for the new current item
///< with Current set to true.
/*TODO
virtual void SetItem(const cEvent *Event, int Index, bool Current, bool Selectable, bool NowNext???, bool Schedule???);
virtual void SetItem(const cTimer *Timer, int Index, bool Current, bool Selectable);
virtual void SetItem(const cChannel *Channel, int Index, bool Current, bool Selectable);
virtual void SetItem(const cRecording *Recording, int Index, bool Current, bool Selectable);
--> false: call SetItem(text)
*/
virtual bool SetItemEvent(const cEvent *Event, int Index, bool Current, bool Selectable, const cChannel *Channel, bool WithDate, int TimerMatch) { return false; }
///< Sets the item at the given Index to Event. See SetItem() for more information.
///< If a derived skin class implements this function, it can display an Event item
///< in a more elaborate way than just a simple line of text.
///< If Channel is not NULL, the channel's name and/or number shall be displayed.
///< If WithDate is true, the date of the Event shall be displayed (in addition to the time).
///< TimerMatch tells how much of this event will be recorded by a timer.
///< If the skin displays the Event item in its own way, it shall return true.
///< The default implementation does nothing and returns false, which results in
///< a call to SetItem() with a proper text.
virtual bool SetItemTimer(const cTimer *Timer, int Index, bool Current, bool Selectable) { return false; }
///< Sets the item at the given Index to Timer. See SetItem() for more information.
///< If a derived skin class implements this function, it can display a Timer item
///< in a more elaborate way than just a simple line of text.
///< If the skin displays the Timer item in its own way, it shall return true.
///< The default implementation does nothing and returns false, which results in
///< a call to SetItem() with a proper text.
virtual bool SetItemChannel(const cChannel *Channel, int Index, bool Current, bool Selectable, bool WithProvider) { return false; }
///< Sets the item at the given Index to Channel. See SetItem() for more information.
///< If a derived skin class implements this function, it can display a Channel item
///< in a more elaborate way than just a simple line of text.
///< If WithProvider ist true, the provider shall be displayed in addition to the
///< channel's name.
///< If the skin displays the Channel item in its own way, it shall return true.
///< The default implementation does nothing and returns false, which results in
///< a call to SetItem() with a proper text.
virtual bool SetItemRecording(const cRecording *Recording, int Index, bool Current, bool Selectable, int Level, int Total, int New) { return false; }
///< Sets the item at the given Index to Recording. See SetItem() for more information.
///< If a derived skin class implements this function, it can display a Recording item
///< in a more elaborate way than just a simple line of text.
///< Level is the currently displayed level of the video directory, where 0 is the
///< top level. A value of -1 means that the full path names of the recordings
///< shall be displayed. If Total is greater than 0, this is a directory with the given
///< total number of entries, and New contains the number of new (unwatched) recordings.
///< If the skin displays the Recording item in its own way, it shall return true.
///< The default implementation does nothing and returns false, which results in
///< a call to SetItem() with a proper text.
virtual void SetScrollbar(int Total, int Offset);
///< Sets the Total number of items in the currently displayed list, and the
///< Offset of the first item that is currently displayed (the skin knows how

View File

@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection.
*
* $Id: svdrp.c 2.19 2012/05/12 11:55:18 kls Exp $
* $Id: svdrp.c 2.21 2012/12/04 12:08:36 kls Exp $
*/
#include "svdrp.h"
@ -917,6 +917,10 @@ void cSVDRP::CmdHELP(const char *Option)
void cSVDRP::CmdHITK(const char *Option)
{
if (*Option) {
if (!cRemote::Enabled()) {
Reply(550, "Remote control currently disabled (key \"%s\" discarded)", Option);
return;
}
char buf[strlen(Option) + 1];
strcpy(buf, Option);
const char *delim = " \t";
@ -1268,7 +1272,7 @@ void cSVDRP::CmdMOVC(const char *Option)
Reply(250,"Channel \"%d\" moved to \"%d\"", From, To);
}
else
Reply(501, "Can't move channel to same postion");
Reply(501, "Can't move channel to same position");
}
else
Reply(501, "Channel \"%d\" not defined", To);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: timers.c 2.14 2012/10/16 08:22:39 kls Exp $
* $Id: timers.c 2.15 2012/12/07 13:14:00 kls Exp $
*/
#include "timers.h"
@ -480,7 +480,7 @@ bool cTimer::Matches(time_t t, bool Directly, int Margin) const
#define FULLMATCH 1000
int cTimer::Matches(const cEvent *Event, int *Overlap) const
eTimerMatch cTimer::Matches(const cEvent *Event, int *Overlap) const
{
// Overlap is the percentage of the Event's duration that is covered by
// this timer (based on FULLMATCH for finer granularity than just 100).
@ -758,12 +758,12 @@ cTimer *cTimers::GetMatch(time_t t)
return t0;
}
cTimer *cTimers::GetMatch(const cEvent *Event, int *Match)
cTimer *cTimers::GetMatch(const cEvent *Event, eTimerMatch *Match)
{
cTimer *t = NULL;
int m = tmNone;
eTimerMatch m = tmNone;
for (cTimer *ti = First(); ti; ti = Next(ti)) {
int tm = ti->Matches(Event);
eTimerMatch tm = ti->Matches(Event);
if (tm > m) {
t = ti;
m = tm;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: timers.h 2.4 2012/04/15 13:21:31 kls Exp $
* $Id: timers.h 2.5 2012/12/07 13:13:40 kls Exp $
*/
#ifndef __TIMERS_H
@ -77,7 +77,7 @@ public:
static time_t SetTime(time_t t, int SecondsFromMidnight);
void SetFile(const char *File);
bool Matches(time_t t = 0, bool Directly = false, int Margin = 0) const;
int Matches(const cEvent *Event, int *Overlap = NULL) const;
eTimerMatch Matches(const cEvent *Event, int *Overlap = NULL) const;
bool Expired(void) const;
time_t StartTime(void) const;
time_t StopTime(void) const;
@ -116,7 +116,7 @@ public:
cTimers(void);
cTimer *GetTimer(cTimer *Timer);
cTimer *GetMatch(time_t t);
cTimer *GetMatch(const cEvent *Event, int *Match = NULL);
cTimer *GetMatch(const cEvent *Event, eTimerMatch *Match = NULL);
cTimer *GetNextActiveTimer(void);
int BeingEdited(void) { return beingEdited; }
void IncBeingEdited(void) { beingEdited++; }

39
tools.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: tools.c 2.26 2012/09/30 13:04:14 kls Exp $
* $Id: tools.c 2.29 2012/12/08 11:16:30 kls Exp $
*/
#include "tools.h"
@ -18,6 +18,7 @@ extern "C" {
#include <jpeglib.h>
#undef boolean
}
#include <locale.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/vfs.h>
@ -302,6 +303,39 @@ cString AddDirectory(const char *DirName, const char *FileName)
return cString::sprintf("%s/%s", DirName && *DirName ? DirName : ".", FileName);
}
#define DECIMAL_POINT_C '.'
double atod(const char *s)
{
static lconv *loc = localeconv();
if (*loc->decimal_point != DECIMAL_POINT_C) {
char buf[strlen(s) + 1];
char *p = buf;
while (*s) {
if (*s == DECIMAL_POINT_C)
*p = *loc->decimal_point;
else
*p = *s;
p++;
s++;
}
*p = 0;
return atof(buf);
}
else
return atof(s);
}
cString dtoa(double d, const char *Format)
{
static lconv *loc = localeconv();
char buf[16];
snprintf(buf, sizeof(buf), Format, d);
if (*loc->decimal_point != DECIMAL_POINT_C)
strreplace(buf, *loc->decimal_point, DECIMAL_POINT_C);
return buf;
}
cString itoa(int n)
{
char buf[16];
@ -842,7 +876,8 @@ cCharSetConv::cCharSetConv(const char *FromCode, const char *ToCode)
cCharSetConv::~cCharSetConv()
{
free(result);
iconv_close(cd);
if (cd != (iconv_t)-1)
iconv_close(cd);
}
void cCharSetConv::SetSystemCharacterTable(const char *CharacterTable)

10
tools.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: tools.h 2.22 2012/09/30 11:02:21 kls Exp $
* $Id: tools.h 2.23 2012/12/06 08:59:39 kls Exp $
*/
#ifndef __TOOLS_H
@ -216,6 +216,14 @@ int64_t StrToNum(const char *s);
bool StrInArray(const char *a[], const char *s);
///< Returns true if the string s is equal to one of the strings pointed
///< to by the (NULL terminated) array a.
double atod(const char *s);
///< Converts the given string, which is a floating point number using a '.' as
///< the decimal point, to a double value, independent of the currently selected
///< locale.
cString dtoa(double d, const char *Format = "%f");
///< Converts the given double value to a string, making sure it uses a '.' as
///< the decimal point, independent of the currently selected locale.
///< If Format is given, it will be used instead of the default.
cString itoa(int n);
cString AddDirectory(const char *DirName, const char *FileName);
bool EntriesOnSameFileSystem(const char *File1, const char *File2);

8
vdr.c
View File

@ -22,7 +22,7 @@
*
* The project's page is at http://www.tvdr.de
*
* $Id: vdr.c 2.42 2012/10/13 12:48:56 kls Exp $
* $Id: vdr.c 2.45 2012/12/06 10:29:23 kls Exp $
*/
#include <getopt.h>
@ -174,7 +174,6 @@ int main(int argc, char *argv[])
// Initiate locale:
setlocale(LC_ALL, "");
setlocale(LC_NUMERIC, "C"); // makes sure any floating point numbers written use a decimal point
// Command line options:
@ -1000,11 +999,11 @@ int main(int argc, char *argv[])
break;
// Direct main menu functions:
#define DirectMainFunction(function)\
DELETE_MENU;\
{ DELETE_MENU;\
if (cControl::Control())\
cControl::Control()->Hide();\
Menu = new cMenuMain(function);\
key = kNone; // nobody else needs to see this key
key = kNone; } // nobody else needs to see this key
case kSchedule: DirectMainFunction(osSchedule); break;
case kChannels: DirectMainFunction(osChannels); break;
case kTimers: DirectMainFunction(osTimers); break;
@ -1089,6 +1088,7 @@ int main(int argc, char *argv[])
key = kNone;
break;
// Pausing live video:
case kPlayPause:
case kPause:
if (!cControl::Control()) {
DELETE_MENU;