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 a patch that was used to implement the --localedir option
for reporting a problem with updating CA descriptors in transfer mode on full for reporting a problem with updating CA descriptors in transfer mode on full
featured DVB cards 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> Ulrich Röder <roeder@efr-net.de>
for pointing out that there are channels that have a symbol rate higher than 27500 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 reporting duplicate texts in i18n.c
for suggesting to use 'gettext' for internationalization for suggesting to use 'gettext' for internationalization
for exporting some libsi functions 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> Mattias Grönlund <Mattias@Gronlund.net>
for pointing out a missing cleanup at program exit in case there is a problem 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 pointing out that the variable HasSnr was unused in cDvbTuner::GetSignalQuality()
for fixing cConfig::Load() for g++ version 4.7.0 for fixing cConfig::Load() for g++ version 4.7.0
for fixing some typos in HISTORY and CONTRIBUTORS for fixing some typos in HISTORY and CONTRIBUTORS
for fixing some spellings in osd.h and svdrp.c
Steffen Beyer <cpunk@reactor.de> Steffen Beyer <cpunk@reactor.de>
for fixing setting the colored button help after deleting a recording in case the next 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 for suggesting that the primary device should only be avoided for recording if
it is an old SD full featured card it is an old SD full featured card
for his support in using convert/ffmpeg in the pic2mpg script of the 'pictures' plugin 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> Jürgen Schilling <juergen_schilling@web.de>
for reporting that color buttons were displayed in the recording info menu if it 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 for reporting that the "'1' for encrypted radio channels" part in the description
of the VPID in vdr.5 is obsolete of the VPID in vdr.5 is obsolete
for a patch that was used to implement storing the channel name in info.vdr 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> Daniel Karsubka <dkar@gmx.de>
for suggesting to write the epg.data file when VDR exits 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 that might inadvertently be called with a 'char *' as the second argument on some
compilers and cause a crash compilers and cause a crash
for reporting a possible memory leak in SI::StructureLoop::getNextAsPointer() 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> Ales Jurik <ajurik@quick.cz>
for reporting broken SI data on Czech/Slovak channels after changing the default 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 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 for a patch that was used as a base for making editing marks be updated every 10
seconds during replay 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> Rene van den Braken <rene@vandenbraken.name>
for reporting a bug in writing the PCR pid into the PMT in 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 a patch that was used to implement SCR (Satellite Channel Routing)
for implementing the SVDRP command 'UPDR' for implementing the SVDRP command 'UPDR'
for reporting that the SVDRP command UPDR didn't update the global recordings list 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> Alex Lasnier <alex@fepg.org>
for adding tuning support for ATSC devices 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 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 for reporting a problem with EPG scan on systems with only a single DVB device that
use software output use software output
for fixing calling iconv_close() only with a valid iconv_t value
Sergiu Dotenco <sergiu.dotenco@googlemail.com> Sergiu Dotenco <sergiu.dotenco@googlemail.com>
for reporting a missing initialization in sDvbSpuRect 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]" for a patch that was used to implement the setup options "OSD/Color key [0123]"
Andrey Pridvorov <ua0lnj@bk.ru> 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 a better way of doing it
Jens Vogel <jens.vogel@akjv.de> 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 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 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 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> Peter Münster <pmlists@free.fr>
for fixing 'make install' to not overwrite existing configuration files 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. - 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 - The script given to VDR with the '-r' option is now also called whenever a
recording is deleted (thanks to Alexander Wenzel). 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 - 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 recordings that have been converted from the old PES format to TS can be played
(suggested by Jens Vogel). (suggested by Jens Vogel).
@ -7305,7 +7305,7 @@ Video Disk Recorder Revision History
Sundararaj Reel). Sundararaj Reel).
- Fixed handling timers in case an event is modified and "phased out" while the timer - Fixed handling timers in case an event is modified and "phased out" while the timer
is recording. 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 necessary information about frames and slices.
- The initial syncing of the frame detector is now done immediately after the first - 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 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. 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 - 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' 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. 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 - Modified editing marks are now written to disk whenever the replay progress display
gets hidden (thanks to Christoph Haubrich). 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, Info display information on the currently viewed programme or recording,
or on the current item in a menu 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 Play resume normal replay
Pause pause replay or live video Pause pause replay or live video
Stop stop replay 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 - 4, 6 Move an editing mark back and forward. You need to first jump to
an editing mark for this to work. an editing mark for this to work.
- 7, 9 Jump back and forward between editing marks. Replay goes into still - 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 - 8 Positions replay at a point 3 seconds before the current or next
"begin" mark and starts replay. "begin" mark and starts replay.
- 2 Start the actual cutting process. - 2 Start the actual cutting process.
@ -879,6 +882,15 @@ Version 1.6
Defines whether the replay progress display shows the Defines whether the replay progress display shows the
remaining time or the total length of the recording. 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 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 environment, so that every user has his/her own resume
files for each recording. The valid range is 0...99, with 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. * 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 #ifndef __DVBHDFFDEVICE_H
#define __DVBHDFFDEVICE_H #define __DVBHDFFDEVICE_H
#include "hdffcmd.h" #include "hdffcmd.h"
#include "vdr/dvbdevice.h" #include <vdr/dvbdevice.h>
#include "vdr/dvbspu.h" #include <vdr/dvbspu.h>
/// The cDvbHdFfDevice implements a DVB device which can be accessed through the Linux DVB driver API. /// 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. * 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 #ifndef __DVBSDFFDEVICE_H
#define __DVBSDFFDEVICE_H #define __DVBSDFFDEVICE_H
#include "vdr/dvbdevice.h" #include <vdr/dvbdevice.h>
#include "vdr/dvbspu.h" #include <vdr/dvbspu.h>
/// The cDvbSdFfDevice implements a DVB device which can be accessed through the Linux DVB driver API. /// 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. * 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 #ifndef __DVBSDFFODF_H
#define __DVBSDFFODF_H #define __DVBSDFFODF_H
#include "vdr/osd.h" #include <vdr/osd.h>
class cDvbOsdProvider : public cOsdProvider { class cDvbOsdProvider : public cOsdProvider {
private: private:

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: config.c 2.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" #include "config.h"
@ -458,6 +458,8 @@ cSetup::cSetup(void)
MultiSpeedMode = 0; MultiSpeedMode = 0;
ShowReplayMode = 0; ShowReplayMode = 0;
ShowRemainingTime = 0; ShowRemainingTime = 0;
ProgressDisplayTime = 0;
PauseOnMarkSet = 0;
ResumeID = 0; ResumeID = 0;
CurrentChannel = -1; CurrentChannel = -1;
CurrentVolume = MAXVOLUME; 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) 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) 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, "UseDolbyDigital")) UseDolbyDigital = atoi(Value);
else if (!strcasecmp(Name, "ChannelInfoPos")) ChannelInfoPos = atoi(Value); else if (!strcasecmp(Name, "ChannelInfoPos")) ChannelInfoPos = atoi(Value);
else if (!strcasecmp(Name, "ChannelInfoTime")) ChannelInfoTime = atoi(Value); else if (!strcasecmp(Name, "ChannelInfoTime")) ChannelInfoTime = atoi(Value);
else if (!strcasecmp(Name, "OSDLeftP")) OSDLeftP = atof(Value); else if (!strcasecmp(Name, "OSDLeftP")) OSDLeftP = atod(Value);
else if (!strcasecmp(Name, "OSDTopP")) OSDTopP = atof(Value); else if (!strcasecmp(Name, "OSDTopP")) OSDTopP = atod(Value);
else if (!strcasecmp(Name, "OSDWidthP")) { OSDWidthP = atof(Value); ChkDoublePlausibility(OSDWidthP, 0.87); } else if (!strcasecmp(Name, "OSDWidthP")) { OSDWidthP = atod(Value); ChkDoublePlausibility(OSDWidthP, 0.87); }
else if (!strcasecmp(Name, "OSDHeightP")) { OSDHeightP = atof(Value); ChkDoublePlausibility(OSDHeightP, 0.84); } else if (!strcasecmp(Name, "OSDHeightP")) { OSDHeightP = atod(Value); ChkDoublePlausibility(OSDHeightP, 0.84); }
else if (!strcasecmp(Name, "OSDLeft")) OSDLeft = atoi(Value); else if (!strcasecmp(Name, "OSDLeft")) OSDLeft = atoi(Value);
else if (!strcasecmp(Name, "OSDTop")) OSDTop = 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, "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, "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, "OSDMessageTime")) OSDMessageTime = atoi(Value);
else if (!strcasecmp(Name, "UseSmallFont")) UseSmallFont = atoi(Value); else if (!strcasecmp(Name, "UseSmallFont")) UseSmallFont = atoi(Value);
else if (!strcasecmp(Name, "AntiAlias")) AntiAlias = atoi(Value); else if (!strcasecmp(Name, "AntiAlias")) AntiAlias = atoi(Value);
else if (!strcasecmp(Name, "FontOsd")) Utf8Strn0Cpy(FontOsd, Value, MAXFONTNAME); else if (!strcasecmp(Name, "FontOsd")) Utf8Strn0Cpy(FontOsd, Value, MAXFONTNAME);
else if (!strcasecmp(Name, "FontSml")) Utf8Strn0Cpy(FontSml, Value, MAXFONTNAME); else if (!strcasecmp(Name, "FontSml")) Utf8Strn0Cpy(FontSml, Value, MAXFONTNAME);
else if (!strcasecmp(Name, "FontFix")) Utf8Strn0Cpy(FontFix, 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, "FontOsdSizeP")) { FontOsdSizeP = atod(Value); ChkDoublePlausibility(FontOsdSizeP, 0.038); }
else if (!strcasecmp(Name, "FontSmlSizeP")) { FontSmlSizeP = atof(Value); ChkDoublePlausibility(FontSmlSizeP, 0.035); } else if (!strcasecmp(Name, "FontSmlSizeP")) { FontSmlSizeP = atod(Value); ChkDoublePlausibility(FontSmlSizeP, 0.035); }
else if (!strcasecmp(Name, "FontFixSizeP")) { FontFixSizeP = atof(Value); ChkDoublePlausibility(FontFixSizeP, 0.031); } else if (!strcasecmp(Name, "FontFixSizeP")) { FontFixSizeP = atod(Value); ChkDoublePlausibility(FontFixSizeP, 0.031); }
else if (!strcasecmp(Name, "FontOsdSize")) FontOsdSize = atoi(Value); else if (!strcasecmp(Name, "FontOsdSize")) FontOsdSize = atoi(Value);
else if (!strcasecmp(Name, "FontSmlSize")) FontSmlSize = atoi(Value); else if (!strcasecmp(Name, "FontSmlSize")) FontSmlSize = atoi(Value);
else if (!strcasecmp(Name, "FontFixSize")) FontFixSize = 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, "MultiSpeedMode")) MultiSpeedMode = atoi(Value);
else if (!strcasecmp(Name, "ShowReplayMode")) ShowReplayMode = atoi(Value); else if (!strcasecmp(Name, "ShowReplayMode")) ShowReplayMode = atoi(Value);
else if (!strcasecmp(Name, "ShowRemainingTime")) ShowRemainingTime = 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, "ResumeID")) ResumeID = atoi(Value);
else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value); else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value);
else if (!strcasecmp(Name, "CurrentVolume")) CurrentVolume = atoi(Value); else if (!strcasecmp(Name, "CurrentVolume")) CurrentVolume = atoi(Value);
@ -761,6 +765,8 @@ bool cSetup::Save(void)
Store("MultiSpeedMode", MultiSpeedMode); Store("MultiSpeedMode", MultiSpeedMode);
Store("ShowReplayMode", ShowReplayMode); Store("ShowReplayMode", ShowReplayMode);
Store("ShowRemainingTime", ShowRemainingTime); Store("ShowRemainingTime", ShowRemainingTime);
Store("ProgressDisplayTime",ProgressDisplayTime);
Store("PauseOnMarkSet", PauseOnMarkSet);
Store("ResumeID", ResumeID); Store("ResumeID", ResumeID);
Store("CurrentChannel", CurrentChannel); Store("CurrentChannel", CurrentChannel);
Store("CurrentVolume", CurrentVolume); Store("CurrentVolume", CurrentVolume);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: config.h 2.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 #ifndef __CONFIG_H
@ -22,13 +22,13 @@
// VDR's own version number: // VDR's own version number:
#define VDRVERSION "1.7.32" #define VDRVERSION "1.7.33"
#define VDRVERSNUM 10732 // Version * 10000 + Major * 100 + Minor #define VDRVERSNUM 10733 // Version * 10000 + Major * 100 + Minor
// The plugin API's version number: // The plugin API's version number:
#define APIVERSION "1.7.32" #define APIVERSION "1.7.33"
#define APIVERSNUM 10732 // Version * 10000 + Major * 100 + Minor #define APIVERSNUM 10733 // Version * 10000 + Major * 100 + Minor
// When loading plugins, VDR searches them by their APIVERSION, which // When loading plugins, VDR searches them by their APIVERSION, which
// may be smaller than VDRVERSION in case there have been no changes to // may be smaller than VDRVERSION in case there have been no changes to
@ -319,6 +319,8 @@ public:
int MultiSpeedMode; int MultiSpeedMode;
int ShowReplayMode; int ShowReplayMode;
int ShowRemainingTime; int ShowRemainingTime;
int ProgressDisplayTime;
int PauseOnMarkSet;
int ResumeID; int ResumeID;
int CurrentChannel; int CurrentChannel;
int CurrentVolume; int CurrentVolume;

View File

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

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.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" #include "device.h"
@ -1149,7 +1149,7 @@ void cDevice::StillPicture(const uchar *Data, int Length)
int Pid = TsPid(Data); int Pid = TsPid(Data);
if (Pid == PATPID) if (Pid == PATPID)
patPmtParser.ParsePat(Data, TS_SIZE); patPmtParser.ParsePat(Data, TS_SIZE);
else if (Pid == patPmtParser.PmtPid()) else if (patPmtParser.IsPmtPid(Pid))
patPmtParser.ParsePmt(Data, TS_SIZE); patPmtParser.ParsePmt(Data, TS_SIZE);
else if (Pid == patPmtParser.Vpid()) { else if (Pid == patPmtParser.Vpid()) {
if (TsPayloadStart(Data)) { if (TsPayloadStart(Data)) {
@ -1486,7 +1486,7 @@ int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
if (PayloadOffset < TS_SIZE) { if (PayloadOffset < TS_SIZE) {
if (Pid == PATPID) if (Pid == PATPID)
patPmtParser.ParsePat(Data, TS_SIZE); patPmtParser.ParsePat(Data, TS_SIZE);
else if (Pid == patPmtParser.PmtPid()) else if (patPmtParser.IsPmtPid(Pid))
patPmtParser.ParsePmt(Data, TS_SIZE); patPmtParser.ParsePmt(Data, TS_SIZE);
else if (Pid == patPmtParser.Vpid()) { else if (Pid == patPmtParser.Vpid()) {
isPlayingVideo = true; isPlayingVideo = true;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.h 2.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 #ifndef __DEVICE_H
@ -655,6 +655,33 @@ public:
virtual bool IsPlayingVideo(void) const { return isPlayingVideo; } virtual bool IsPlayingVideo(void) const { return isPlayingVideo; }
///< \return Returns true if the currently attached player has delivered ///< \return Returns true if the currently attached player has delivered
///< any video packets. ///< 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; } virtual bool HasIBPTrickSpeed(void) { return false; }
///< Returns true if this device can handle all frames in 'fast forward' ///< Returns true if this device can handle all frames in 'fast forward'
///< trick speeds. ///< trick speeds.

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: dvbdevice.c 2.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" #include "dvbdevice.h"
@ -261,16 +261,16 @@ bool cDvbTransponderParameters::Parse(const char *s)
case 'C': s = ParseParameter(s, coderateH, CoderateValues); break; case 'C': s = ParseParameter(s, coderateH, CoderateValues); break;
case 'D': s = ParseParameter(s, coderateL, CoderateValues); break; case 'D': s = ParseParameter(s, coderateL, CoderateValues); break;
case 'G': s = ParseParameter(s, guard, GuardValues); 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 '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 'M': s = ParseParameter(s, modulation, ModulationValues); break;
case 'O': s = ParseParameter(s, rollOff, RollOffValues); break; case 'O': s = ParseParameter(s, rollOff, RollOffValues); break;
case 'P': s = ParseParameter(s, plpId); 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 '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 '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; case 'Y': s = ParseParameter(s, hierarchy, HierarchyValues); break;
default: esyslog("ERROR: unknown parameter key '%c'", *s); default: esyslog("ERROR: unknown parameter key '%c'", *s);
return false; return false;

35
eit.c
View File

@ -8,10 +8,11 @@
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. * 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>. * 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 "eit.h"
#include <sys/time.h>
#include "epg.h" #include "epg.h"
#include "i18n.h" #include "i18n.h"
#include "libsi/section.h" #include "libsi/section.h"
@ -313,35 +314,48 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
// --- cTDT ------------------------------------------------------------------ // --- 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 { class cTDT : public SI::TDT {
private: private:
static cMutex mutex; static cMutex mutex;
static int lastDiff; static time_t lastAdj;
public: public:
cTDT(const u_char *Data); cTDT(const u_char *Data);
}; };
cMutex cTDT::mutex; cMutex cTDT::mutex;
int cTDT::lastDiff = 0; time_t cTDT::lastAdj = 0;
cTDT::cTDT(const u_char *Data) cTDT::cTDT(const u_char *Data)
:SI::TDT(Data, false) :SI::TDT(Data, false)
{ {
CheckParse(); CheckParse();
time_t sattim = getTime(); time_t dvbtim = getTime();
time_t loctim = time(NULL); time_t loctim = time(NULL);
int diff = abs(sattim - loctim); int diff = dvbtim - loctim;
if (diff > 2) { if (abs(diff) > MAX_TIME_DIFF) {
mutex.Lock(); mutex.Lock();
if (abs(diff - lastDiff) < 3) { if (abs(diff) > MAX_ADJ_DIFF) {
if (stime(&sattim) == 0) if (stime(&dvbtim) == 0)
isyslog("system time changed from %s (%ld) to %s (%ld)", *TimeToString(loctim), loctim, *TimeToString(sattim), sattim); isyslog("system time changed from %s (%ld) to %s (%ld)", *TimeToString(loctim), loctim, *TimeToString(dvbtim), dvbtim);
else else
esyslog("ERROR while setting system time: %m"); 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(); mutex.Unlock();
} }
} }
@ -353,7 +367,6 @@ time_t cEitFilter::disableUntil = 0;
cEitFilter::cEitFilter(void) cEitFilter::cEitFilter(void)
{ {
Set(0x12, 0x40, 0xC0); // event info now&next actual/other TS (0x4E/0x4F), future actual/other TS (0x5X/0x6X) 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
} }

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: 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" #include "interface.h"
@ -160,6 +160,7 @@ void cInterface::LearnKeys(void)
dsyslog("remote control %s - %s", Remote->Name(), known ? "keys known" : "learning keys"); dsyslog("remote control %s - %s", Remote->Name(), known ? "keys known" : "learning keys");
if (!known) { if (!known) {
cSkinDisplayMenu *DisplayMenu = Skins.Current()->DisplayMenu(); cSkinDisplayMenu *DisplayMenu = Skins.Current()->DisplayMenu();
DisplayMenu->SetMenuCategory(mcUnknown);
char Headline[256]; char Headline[256];
snprintf(Headline, sizeof(Headline), tr("Learning Remote Control Keys")); snprintf(Headline, sizeof(Headline), tr("Learning Remote Control Keys"));
cRemote::Clear(); cRemote::Clear();

3
keys.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: 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" #include "keys.h"
@ -33,6 +33,7 @@ static tKey keyTable[] = { // "Up" and "Down" must be the first two keys!
{ k8, "8" }, { k8, "8" },
{ k9, "9" }, { k9, "9" },
{ kInfo, trNOOP("Key$Info") }, { kInfo, trNOOP("Key$Info") },
{ kPlayPause, trNOOP("Key$Play/Pause") },
{ kPlay, trNOOP("Key$Play") }, { kPlay, trNOOP("Key$Play") },
{ kPause, trNOOP("Key$Pause") }, { kPause, trNOOP("Key$Pause") },
{ kStop, trNOOP("Key$Stop") }, { kStop, trNOOP("Key$Stop") },

3
keys.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: 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 #ifndef __KEYS_H
@ -27,6 +27,7 @@ enum eKeys { // "Up" and "Down" must be the first two keys!
kBlue, kBlue,
k0, k1, k2, k3, k4, k5, k6, k7, k8, k9, k0, k1, k2, k3, k4, k5, k6, k7, k8, k9,
kInfo, kInfo,
kPlayPause, // combined Play/Pause key
kPlay, kPlay,
kPause, kPause,
kStop, kStop,

130
menu.c
View File

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

3
menu.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: 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 #ifndef __MENU_H
@ -208,7 +208,6 @@ private:
eOSState Commands(eKeys Key = kNone); eOSState Commands(eKeys Key = kNone);
protected: protected:
cString DirectoryName(void); cString DirectoryName(void);
cRecording *GetRecording(cMenuRecordingItem *Item);
public: public:
cMenuRecordings(const char *Base = NULL, int Level = 0, bool OpenSubMenus = false); cMenuRecordings(const char *Base = NULL, int Level = 0, bool OpenSubMenus = false);
~cMenuRecordings(); ~cMenuRecordings();

4
osd.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: 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 #ifndef __OSD_H
@ -735,7 +735,7 @@ protected:
///< Initializes the OSD with the given coordinates. ///< Initializes the OSD with the given coordinates.
///< By default it is assumed that the full area will be able to display ///< 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 ///< 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 ///< 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 ///< divide the full OSD area into several sub-areas with lower color depths
///< and individual palettes. The sub-areas need not necessarily cover the ///< 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 * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "osdbase.h"
@ -55,6 +55,11 @@ void cOsdItem::SetFresh(bool Fresh)
fresh = 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) eOSState cOsdItem::ProcessKey(eKeys Key)
{ {
return Key == kOk ? state : osUnknown; return Key == kOk ? state : osUnknown;
@ -246,7 +251,7 @@ void cOsdMenu::Display(void)
int n = 0; int n = 0;
for (cOsdItem *item = Get(first); item; item = Next(item)) { for (cOsdItem *item = Get(first); item; item = Next(item)) {
bool CurrentSelectable = (i == current) && item->Selectable(); 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) if (CurrentSelectable)
cStatus::MsgOsdCurrentItem(item->Text()); cStatus::MsgOsdCurrentItem(item->Text());
if (++n == displayMenuItems) if (++n == displayMenuItems)
@ -275,7 +280,7 @@ void cOsdMenu::DisplayCurrent(bool Current)
{ {
cOsdItem *item = Get(current); cOsdItem *item = Get(current);
if (item) { 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()) if (Current && item->Selectable())
cStatus::MsgOsdCurrentItem(item->Text()); cStatus::MsgOsdCurrentItem(item->Text());
if (!Current) if (!Current)
@ -296,7 +301,7 @@ void cOsdMenu::DisplayItem(cOsdItem *Item)
int Offset = Index - first; int Offset = Index - first;
if (Offset >= 0 && Offset < first + displayMenuItems) { if (Offset >= 0 && Offset < first + displayMenuItems) {
bool Current = Index == current; 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()) if (Current && Item->Selectable())
cStatus::MsgOsdCurrentItem(Item->Text()); cStatus::MsgOsdCurrentItem(Item->Text());
} }

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: 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 #ifndef __OSDBASE_H
@ -63,6 +63,7 @@ public:
void SetFresh(bool Fresh); void SetFresh(bool Fresh);
const char *Text(void) const { return text; } const char *Text(void) const { return text; }
virtual void Set(void) {} virtual void Set(void) {}
virtual void SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable);
virtual eOSState ProcessKey(eKeys Key); 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 * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #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()) { switch (stream.getStreamType()) {
case 1: // STREAMTYPE_11172_VIDEO case 1: // STREAMTYPE_11172_VIDEO
case 2: // STREAMTYPE_13818_VIDEO case 2: // STREAMTYPE_13818_VIDEO
case 0x1B: // MPEG4 case 0x1B: // H.264
Vpid = esPid; Vpid = esPid;
Ppid = pmt.getPCRPid(); Ppid = pmt.getPCRPid();
Vtype = stream.getStreamType(); Vtype = stream.getStreamType();

View File

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

View File

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

View File

@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.14\n" "Project-Id-Version: VDR 1.7.14\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 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" "PO-Revision-Date: 2010-05-06 11:00+0200\n"
"Last-Translator: Radek Šťastný <dedkus@gmail.com>\n" "Last-Translator: Radek Šťastný <dedkus@gmail.com>\n"
"Language-Team: Czech <vdr@linuxtv.org>\n" "Language-Team: Czech <vdr@linuxtv.org>\n"
@ -412,6 +412,9 @@ msgstr "Modrý"
msgid "Key$Info" msgid "Key$Info"
msgstr "Info" msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play" msgid "Key$Play"
msgstr "Přehrát" msgstr "Přehrát"
@ -740,9 +743,6 @@ msgstr "Otevřít"
msgid "Commands" msgid "Commands"
msgstr "Příkazy" msgstr "Příkazy"
msgid "Error while accessing recording!"
msgstr "Chyba při přístupu k nahrávkám!"
msgid "Delete recording?" msgid "Delete recording?"
msgstr "Smazat nahrávku?" msgstr "Smazat nahrávku?"
@ -1103,6 +1103,12 @@ msgstr "Zobrazit režim přehrávání"
msgid "Setup.Replay$Show remaining time" msgid "Setup.Replay$Show remaining time"
msgstr "" msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID" msgid "Setup.Replay$Resume ID"
msgstr "ID obnovení" msgstr "ID obnovení"
@ -1385,3 +1391,6 @@ msgstr "Disk"
msgid "free" msgid "free"
msgstr "volno" 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 "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 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" "PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n" "Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
"Language-Team: Danish <vdr@linuxtv.org>\n" "Language-Team: Danish <vdr@linuxtv.org>\n"
@ -410,6 +410,9 @@ msgstr "Bl
msgid "Key$Info" msgid "Key$Info"
msgstr "Info" msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play" msgid "Key$Play"
msgstr "Afspil" msgstr "Afspil"
@ -738,9 +741,6 @@ msgstr "
msgid "Commands" msgid "Commands"
msgstr "Kommandoer" msgstr "Kommandoer"
msgid "Error while accessing recording!"
msgstr "Fejl ved læsning af optagelse!"
msgid "Delete recording?" msgid "Delete recording?"
msgstr "Slet optagelse?" msgstr "Slet optagelse?"
@ -1101,6 +1101,12 @@ msgstr "Vis afspilningsmodus"
msgid "Setup.Replay$Show remaining time" msgid "Setup.Replay$Show remaining time"
msgstr "" msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID" msgid "Setup.Replay$Resume ID"
msgstr "Genoptagelses ID" msgstr "Genoptagelses ID"
@ -1383,3 +1389,6 @@ msgstr "Disk"
msgid "free" msgid "free"
msgstr "fri" msgstr "fri"
#~ msgid "Error while accessing recording!"
#~ msgstr "Fejl ved læsning af optagelse!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 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" "PO-Revision-Date: 2010-01-16 16:46+0100\n"
"Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n" "Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n"
"Language-Team: German <vdr@linuxtv.org>\n" "Language-Team: German <vdr@linuxtv.org>\n"
@ -410,6 +410,9 @@ msgstr "Blau"
msgid "Key$Info" msgid "Key$Info"
msgstr "Info" msgstr "Info"
msgid "Key$Play/Pause"
msgstr "Wiedergabe/Pause"
msgid "Key$Play" msgid "Key$Play"
msgstr "Wiedergabe" msgstr "Wiedergabe"
@ -738,9 +741,6 @@ msgstr "
msgid "Commands" msgid "Commands"
msgstr "Befehle" msgstr "Befehle"
msgid "Error while accessing recording!"
msgstr "Fehler beim Ansprechen der Aufzeichnung!"
msgid "Delete recording?" msgid "Delete recording?"
msgstr "Aufzeichnung löschen?" msgstr "Aufzeichnung löschen?"
@ -1101,6 +1101,12 @@ msgstr "Wiedergabestatus anzeigen"
msgid "Setup.Replay$Show remaining time" msgid "Setup.Replay$Show remaining time"
msgstr "Verbleibende Zeit anzeigen" 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" msgid "Setup.Replay$Resume ID"
msgstr "Wiedergabe-ID" msgstr "Wiedergabe-ID"
@ -1383,3 +1389,6 @@ msgstr "Disk"
msgid "free" msgid "free"
msgstr "frei" msgstr "frei"
#~ msgid "Error while accessing recording!"
#~ msgstr "Fehler beim Ansprechen der Aufzeichnung!"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 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" "PO-Revision-Date: 2012-01-02 11:54+0200\n"
"Last-Translator: István Füley <ifuley@tigercomp.ro>\n" "Last-Translator: István Füley <ifuley@tigercomp.ro>\n"
"Language-Team: Hungarian <vdr@linuxtv.org>\n" "Language-Team: Hungarian <vdr@linuxtv.org>\n"
@ -413,6 +413,9 @@ msgstr "K
msgid "Key$Info" msgid "Key$Info"
msgstr "Információ" msgstr "Információ"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play" msgid "Key$Play"
msgstr "Lejátszás" msgstr "Lejátszás"
@ -741,9 +744,6 @@ msgstr "Kinyitni"
msgid "Commands" msgid "Commands"
msgstr "Parancsok" msgstr "Parancsok"
msgid "Error while accessing recording!"
msgstr "Hiba a felvétel hozzáférésénél"
msgid "Delete recording?" msgid "Delete recording?"
msgstr "Felvétel törlése?" msgstr "Felvétel törlése?"
@ -1105,6 +1105,12 @@ msgstr "Lej
msgid "Setup.Replay$Show remaining time" msgid "Setup.Replay$Show remaining time"
msgstr "" msgstr ""
msgid "Setup.Replay$Progress display time (s)"
msgstr ""
msgid "Setup.Replay$Pause replay when setting mark"
msgstr ""
msgid "Setup.Replay$Resume ID" msgid "Setup.Replay$Resume ID"
msgstr "Lejátszás ID" msgstr "Lejátszás ID"
@ -1387,3 +1393,6 @@ msgstr "Lemez"
msgid "free" msgid "free"
msgstr "szabad" 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 "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 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" "PO-Revision-Date: 2012-06-06 22:50+0100\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: Italian <vdr@linuxtv.org>\n" "Language-Team: Italian <vdr@linuxtv.org>\n"
@ -417,6 +417,9 @@ msgstr "Blu"
msgid "Key$Info" msgid "Key$Info"
msgstr "Info" msgstr "Info"
msgid "Key$Play/Pause"
msgstr ""
msgid "Key$Play" msgid "Key$Play"
msgstr "Riproduci" msgstr "Riproduci"
@ -745,9 +748,6 @@ msgstr "Apri"
msgid "Commands" msgid "Commands"
msgstr "Comandi" msgstr "Comandi"
msgid "Error while accessing recording!"
msgstr "Errore accesso alla registrazione!"
msgid "Delete recording?" msgid "Delete recording?"
msgstr "Eliminare la registrazione?" msgstr "Eliminare la registrazione?"
@ -1108,6 +1108,12 @@ msgstr "Mostra modalità riproduzione"
msgid "Setup.Replay$Show remaining time" msgid "Setup.Replay$Show remaining time"
msgstr "Mostra tempo rimanente" 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" msgid "Setup.Replay$Resume ID"
msgstr "ID di ripristino" msgstr "ID di ripristino"
@ -1390,3 +1396,6 @@ msgstr "Disco"
msgid "free" msgid "free"
msgstr "disponibili" msgstr "disponibili"
#~ msgid "Error while accessing recording!"
#~ msgstr "Errore accesso alla registrazione!"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

45
remux.c
View File

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

12
remux.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: remux.h 2.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 #ifndef __REMUX_H
@ -327,13 +327,15 @@ public:
// PAT/PMT Parser: // PAT/PMT Parser:
#define MAX_PMT_PIDS 32
class cPatPmtParser { class cPatPmtParser {
private: private:
uchar pmt[MAX_SECTION_SIZE]; uchar pmt[MAX_SECTION_SIZE];
int pmtSize; int pmtSize;
int patVersion; int patVersion;
int pmtVersion; int pmtVersion;
int pmtPid; int pmtPids[MAX_PMT_PIDS + 1]; // list is zero-terminated
int vpid; int vpid;
int ppid; int ppid;
int vtype; int vtype;
@ -373,9 +375,9 @@ public:
bool GetVersions(int &PatVersion, int &PmtVersion) const; bool GetVersions(int &PatVersion, int &PmtVersion) const;
///< Returns true if a valid PAT/PMT has been parsed and stores ///< Returns true if a valid PAT/PMT has been parsed and stores
///< the current version numbers in the given variables. ///< the current version numbers in the given variables.
int PmtPid(void) const { return pmtPid; } bool IsPmtPid(int Pid) const { for (int i = 0; pmtPids[i]; i++) if (pmtPids[i] == Pid) return true; return false; }
///< Returns the PMT pid as defined by the current PAT. ///< Returns true if Pid the one of the PMT pids as defined by the current PAT.
///< If no PAT has been received yet, -1 will be returned. ///< If no PAT has been received yet, false will be returned.
int Vpid(void) const { return vpid; } int Vpid(void) const { return vpid; }
///< Returns the video pid as defined by the current PMT, or 0 if no video ///< Returns the video pid as defined by the current PMT, or 0 if no video
///< pid has been detected, yet. ///< 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 * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 #ifndef __SKINS_H
@ -17,6 +17,7 @@
#include "recording.h" #include "recording.h"
#include "themes.h" #include "themes.h"
#include "thread.h" #include "thread.h"
#include "timers.h"
#include "tools.h" #include "tools.h"
enum eMessageType { mtStatus = 0, mtInfo, mtWarning, mtError }; // will be used to calculate color offsets! enum eMessageType { mtStatus = 0, mtInfo, mtWarning, mtError }; // will be used to calculate color offsets!
@ -49,7 +50,7 @@ public:
class cSkinDisplayChannel : public cSkinDisplay { class cSkinDisplayChannel : public cSkinDisplay {
///< This class is used to display the current channel, together with ///< 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. ///< is done is totally up to the derived class.
public: public:
virtual void SetChannel(const cChannel *Channel, int Number) = 0; 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 ///< 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 false, and then for the new current item
///< with Current set to true. ///< with Current set to true.
/*TODO virtual bool SetItemEvent(const cEvent *Event, int Index, bool Current, bool Selectable, const cChannel *Channel, bool WithDate, int TimerMatch) { return false; }
virtual void SetItem(const cEvent *Event, int Index, bool Current, bool Selectable, bool NowNext???, bool Schedule???); ///< Sets the item at the given Index to Event. See SetItem() for more information.
virtual void SetItem(const cTimer *Timer, int Index, bool Current, bool Selectable); ///< If a derived skin class implements this function, it can display an Event item
virtual void SetItem(const cChannel *Channel, int Index, bool Current, bool Selectable); ///< in a more elaborate way than just a simple line of text.
virtual void SetItem(const cRecording *Recording, int Index, bool Current, bool Selectable); ///< If Channel is not NULL, the channel's name and/or number shall be displayed.
--> false: call SetItem(text) ///< 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); virtual void SetScrollbar(int Total, int Offset);
///< Sets the Total number of items in the currently displayed list, and the ///< 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 ///< 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 * and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection. * graphical interface that sits on top of an SVDRP connection.
* *
* $Id: svdrp.c 2.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" #include "svdrp.h"
@ -917,6 +917,10 @@ void cSVDRP::CmdHELP(const char *Option)
void cSVDRP::CmdHITK(const char *Option) void cSVDRP::CmdHITK(const char *Option)
{ {
if (*Option) { if (*Option) {
if (!cRemote::Enabled()) {
Reply(550, "Remote control currently disabled (key \"%s\" discarded)", Option);
return;
}
char buf[strlen(Option) + 1]; char buf[strlen(Option) + 1];
strcpy(buf, Option); strcpy(buf, Option);
const char *delim = " \t"; const char *delim = " \t";
@ -1268,7 +1272,7 @@ void cSVDRP::CmdMOVC(const char *Option)
Reply(250,"Channel \"%d\" moved to \"%d\"", From, To); Reply(250,"Channel \"%d\" moved to \"%d\"", From, To);
} }
else else
Reply(501, "Can't move channel to same postion"); Reply(501, "Can't move channel to same position");
} }
else else
Reply(501, "Channel \"%d\" not defined", To); Reply(501, "Channel \"%d\" not defined", To);

View File

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

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: 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 #ifndef __TIMERS_H
@ -77,7 +77,7 @@ public:
static time_t SetTime(time_t t, int SecondsFromMidnight); static time_t SetTime(time_t t, int SecondsFromMidnight);
void SetFile(const char *File); void SetFile(const char *File);
bool Matches(time_t t = 0, bool Directly = false, int Margin = 0) const; 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; bool Expired(void) const;
time_t StartTime(void) const; time_t StartTime(void) const;
time_t StopTime(void) const; time_t StopTime(void) const;
@ -116,7 +116,7 @@ public:
cTimers(void); cTimers(void);
cTimer *GetTimer(cTimer *Timer); cTimer *GetTimer(cTimer *Timer);
cTimer *GetMatch(time_t t); cTimer *GetMatch(time_t t);
cTimer *GetMatch(const cEvent *Event, int *Match = NULL); cTimer *GetMatch(const cEvent *Event, eTimerMatch *Match = NULL);
cTimer *GetNextActiveTimer(void); cTimer *GetNextActiveTimer(void);
int BeingEdited(void) { return beingEdited; } int BeingEdited(void) { return beingEdited; }
void IncBeingEdited(void) { beingEdited++; } void IncBeingEdited(void) { beingEdited++; }

37
tools.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: 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" #include "tools.h"
@ -18,6 +18,7 @@ extern "C" {
#include <jpeglib.h> #include <jpeglib.h>
#undef boolean #undef boolean
} }
#include <locale.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/vfs.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); 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) cString itoa(int n)
{ {
char buf[16]; char buf[16];
@ -842,6 +876,7 @@ cCharSetConv::cCharSetConv(const char *FromCode, const char *ToCode)
cCharSetConv::~cCharSetConv() cCharSetConv::~cCharSetConv()
{ {
free(result); free(result);
if (cd != (iconv_t)-1)
iconv_close(cd); iconv_close(cd);
} }

10
tools.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: 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 #ifndef __TOOLS_H
@ -216,6 +216,14 @@ int64_t StrToNum(const char *s);
bool StrInArray(const char *a[], 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 ///< Returns true if the string s is equal to one of the strings pointed
///< to by the (NULL terminated) array a. ///< 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 itoa(int n);
cString AddDirectory(const char *DirName, const char *FileName); cString AddDirectory(const char *DirName, const char *FileName);
bool EntriesOnSameFileSystem(const char *File1, const char *File2); 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 * 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> #include <getopt.h>
@ -174,7 +174,6 @@ int main(int argc, char *argv[])
// Initiate locale: // Initiate locale:
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
setlocale(LC_NUMERIC, "C"); // makes sure any floating point numbers written use a decimal point
// Command line options: // Command line options:
@ -1000,11 +999,11 @@ int main(int argc, char *argv[])
break; break;
// Direct main menu functions: // Direct main menu functions:
#define DirectMainFunction(function)\ #define DirectMainFunction(function)\
DELETE_MENU;\ { DELETE_MENU;\
if (cControl::Control())\ if (cControl::Control())\
cControl::Control()->Hide();\ cControl::Control()->Hide();\
Menu = new cMenuMain(function);\ 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 kSchedule: DirectMainFunction(osSchedule); break;
case kChannels: DirectMainFunction(osChannels); break; case kChannels: DirectMainFunction(osChannels); break;
case kTimers: DirectMainFunction(osTimers); break; case kTimers: DirectMainFunction(osTimers); break;
@ -1089,6 +1088,7 @@ int main(int argc, char *argv[])
key = kNone; key = kNone;
break; break;
// Pausing live video: // Pausing live video:
case kPlayPause:
case kPause: case kPause:
if (!cControl::Control()) { if (!cControl::Control()) {
DELETE_MENU; DELETE_MENU;