Commit 1aadb31f authored by Klaus Schmidinger's avatar Klaus Schmidinger

Version 1.7.5

- Fixed a hangup when replaying a TS recording with subtitles activated (reported
  by Timo Helkio).
- Fixed handling the 'new' indicator in the recordings menu for TS recordings
  (thanks to Derek Kelly).
- Added cap_sys_nice to the capabilities that are not dropped (thanks to Rolf
  Ahrenberg).
- Updated the Italian OSD texts (thanks to Diego Pierotto).
- Added cRecordingInfo::GetEvent() (thanks to Marcel Unbehaun).
- Improved synchronizing the progress display, trick modes and subtitle display
  to the actual audio/video. This now works independent of any buffer sizes the
  output device might use.
  + The cBackTrace class has been replaced with cPtsIndex, which keeps track
    of the PTS timestamps of recently played frames.
  + cDevice::GetSTC() is now required to deliver the STC even in trick modes.
    It is sufficient if it returns the PTS of the most recently presented
    audio/video frame.
  + The full-featured DVB cards need an improved firmware in order to return
    proper STC values in trick modes (thanks to Oliver Endriss for enhancing the
    av7110 firmware).
- Adapted cFrameDetector::Analyze() to HD NTSC broadcasts that split frames over
  several payload units (thanks to Derek Kelly for reporting this and helping in
  testing).
- Modified cFrameDetector::Analyze() to make it process whole frames at once, so
  that file I/O overhead is minimized during recording (reported by Günter
  Niedermeier).
- Added command line help for the '-i' option.
- Fixed cDvbPlayer::NextFile() to handle files larger than 2GB (thanks to Jose
  Alberto Reguero).
- Improved replay at the begin and end of a recording. The very first and very last
  frame is now sent to the output device repeatedly until GetSTC() reports that it
  has been played. cDvbPlayer::Action() no longer calls DeviceFlush() (thanks to
  Reinhard Nissl for making sure vdr-xine no longer needs this).
- Added missing '[]' to the delete operator in cMenuEditStrItem::~cMenuEditStrItem().
- Added missing virtual destructor to cPalette.
- Now freeing configDirectory before setting it to a new value in
  cPlugin::SetConfigDirectory().
- Fixed a crash when jumping to an editing mark in an audio recording.
- Fixed the 'VideoOnly' condition in the PlayPes() and PlayTs() calls in
  cDvbPlayer::Action() (thanks to Reinhard Nissl).
- cDevice::PlayTs() now plays as many TS packets as possible in one call.
- Making sure any floating point numbers written use a decimal point (thanks to
  Oliver Endriss for pointing out a problem with the F record in the info file of
  a recording).
- Fixed detecting the frame rate for radio recordings.
- Added missing AUDIO_PAUSE/AUDIO_CONTINUE calls to cDvbDevice (thanks to Oliver
  Endriss).
- No longer writing the video type into channels.conf if VPID is 0 (thanks to
  Oliver Endriss for reporting this).
- Improved efficiency of cEIT::cEIT() (thanks to Tobias Bratfisch).
parent 084e16c0
......@@ -662,6 +662,13 @@ Oliver Endriss <o.endriss@gmx.de>
Transfer Mode
for providing a driver patch that allows direct replaying of TS video on full-featured
DVB cards
for improving the firmware of FF DVB cards to allow getting the current STC value
even in trick modes
for pointing out a problem with the decimal point of the F record in the info file of
a recording
for adding missing AUDIO_PAUSE/AUDIO_CONTINUE calls to cDvbDevice
for reporting that the video type is unnecessarily written into channels.conf if
VPID is 0
Reinhard Walter Buchner <rw.buchner@freenet.de>
for adding some satellites to 'sources.conf'
......@@ -1061,6 +1068,7 @@ Rolf Ahrenberg <rahrenbe@cc.hut.fi>
the last replayed recording was in a subdirectory, and pressing Back
for setting the thread name, so that it can be seen in 'top -H'
for replacing the Finnish language code "smi" with "suo"
for adding cap_sys_nice to the capabilities that are not dropped
Ralf Klueber <ralf.klueber@vodafone.com>
for reporting a bug in cutting a recording if there is only a single editing mark
......@@ -1197,6 +1205,9 @@ Reinhard Nissl <rnissl@gmx.de>
to cDevice::PlayTs()
for reporting that the PAT/PMT is processed too often, even if its version
hasn't changed
for making sure vdr-xine no longer needs cDvbPlayer::Action() to call DeviceFlush()
for fixing the 'VideoOnly' condition in the PlayPes() and PlayTs() calls in
cDvbPlayer::Action()
Richard Robson <richard_robson@beeb.net>
for reporting freezing replay if a timer starts while in Transfer Mode from the
......@@ -2279,6 +2290,7 @@ Alexander Riedel <alexander-riedel@t-online.de>
Jose Alberto Reguero <jareguero@telefonica.net>
for a patch that fixed part of a crash in i18n character set conversion
for fixing cDvbPlayer::NextFile() to handle files larger than 2GB
Patrice Staudt <staudt@engsystem.net>
for adding full weekday names to i18n.c for plugins to use
......@@ -2290,6 +2302,7 @@ Tobias Bratfisch <tobias@reel-multimedia.com>
for optimizing cMenuEditChrItem::Set()
for optimizing cNitFilter::Process()
for reducing the number of time(NULL) calls in vdr.c's main loop to a single call
for improving efficiency of cEIT::cEIT()
Bruno Roussel <bruno.roussel@free.fr>
for translating OSD texts to the French language
......@@ -2412,4 +2425,17 @@ Johann Friedrichs <johann.friedrichs@web.de>
for fixing incrementing the continuity counter in cPatPmtGenerator::GetPmt()
for pointing out that "DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
-D_LARGEFILE64_SOURCE" should be added to Make.config.
to Make.config.template (thanks to Johann Friedrichs for pointing this out).
Timo Helkio <timolavi@mbnet.fi>
for reporting a hangup when replaying a TS recording with subtitles activated
Derek Kelly (user.vdr@gmail.com)
for fixing handling the 'new' indicator in the recordings menu for TS recordings
for reporting a problem with HD NTSC broadcasts that split frames over several payload
units
Marcel Unbehaun <frostworks@gmx.de>
for adding cRecordingInfo::GetEvent()
Günter Niedermeier <linuxtv@ncs-online.de>
for reporting a problem with file I/O overhead during recording in TS format
......@@ -5978,3 +5978,55 @@ Video Disk Recorder Revision History
player whether there is video data in the currently replayed stream. If a derived
cDevice class reimplements PlayTs() or PlayPes(), it also needs to make sure this
new function works as expected.
2009-04-12: Version 1.7.5
- Fixed a hangup when replaying a TS recording with subtitles activated (reported
by Timo Helkio).
- Fixed handling the 'new' indicator in the recordings menu for TS recordings
(thanks to Derek Kelly).
- Added cap_sys_nice to the capabilities that are not dropped (thanks to Rolf
Ahrenberg).
- Updated the Italian OSD texts (thanks to Diego Pierotto).
- Added cRecordingInfo::GetEvent() (thanks to Marcel Unbehaun).
- Improved synchronizing the progress display, trick modes and subtitle display
to the actual audio/video. This now works independent of any buffer sizes the
output device might use.
+ The cBackTrace class has been replaced with cPtsIndex, which keeps track
of the PTS timestamps of recently played frames.
+ cDevice::GetSTC() is now required to deliver the STC even in trick modes.
It is sufficient if it returns the PTS of the most recently presented
audio/video frame.
+ The full-featured DVB cards need an improved firmware in order to return
proper STC values in trick modes (thanks to Oliver Endriss for enhancing the
av7110 firmware).
- Adapted cFrameDetector::Analyze() to HD NTSC broadcasts that split frames over
several payload units (thanks to Derek Kelly for reporting this and helping in
testing).
- Modified cFrameDetector::Analyze() to make it process whole frames at once, so
that file I/O overhead is minimized during recording (reported by Günter
Niedermeier).
- Added command line help for the '-i' option.
- Fixed cDvbPlayer::NextFile() to handle files larger than 2GB (thanks to Jose
Alberto Reguero).
- Improved replay at the begin and end of a recording. The very first and very last
frame is now sent to the output device repeatedly until GetSTC() reports that it
has been played. cDvbPlayer::Action() no longer calls DeviceFlush() (thanks to
Reinhard Nissl for making sure vdr-xine no longer needs this).
- Added missing '[]' to the delete operator in cMenuEditStrItem::~cMenuEditStrItem().
- Added missing virtual destructor to cPalette.
- Now freeing configDirectory before setting it to a new value in
cPlugin::SetConfigDirectory().
- Fixed a crash when jumping to an editing mark in an audio recording.
- Fixed the 'VideoOnly' condition in the PlayPes() and PlayTs() calls in
cDvbPlayer::Action() (thanks to Reinhard Nissl).
- cDevice::PlayTs() now plays as many TS packets as possible in one call.
- Making sure any floating point numbers written use a decimal point (thanks to
Oliver Endriss for pointing out a problem with the F record in the info file of
a recording).
- Fixed detecting the frame rate for radio recordings.
- Added missing AUDIO_PAUSE/AUDIO_CONTINUE calls to cDvbDevice (thanks to Oliver
Endriss).
- No longer writing the video type into channels.conf if VPID is 0 (thanks to
Oliver Endriss for reporting this).
- Improved efficiency of cEIT::cEIT() (thanks to Tobias Bratfisch).
......@@ -16,8 +16,7 @@ to Make.config and adjust the definition of DVBDIR in that file.
Refer to http://linuxtv.org for more information about the Linux-DVB driver.
VDR requires the Linux-DVB driver version dated 2003-08-23 or higher
to work properly.
VDR requires the Linux-DVB driver version that supports the S2API interface.
You will also need to install the following libraries, as well as their
"devel" packages to get the necessary header files for compiling VDR:
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: channels.c 2.4 2008/12/13 11:42:15 kls Exp $
* $Id: channels.c 2.5 2009/04/10 11:29:55 kls Exp $
*/
#include "channels.h"
......@@ -724,7 +724,7 @@ cString cChannel::ToText(const cChannel *Channel)
q += snprintf(q, sizeof(vpidbuf), "%d", Channel->vpid);
if (Channel->ppid && Channel->ppid != Channel->vpid)
q += snprintf(q, sizeof(vpidbuf) - (q - vpidbuf), "+%d", Channel->ppid);
if (Channel->vtype)
if (Channel->vpid && Channel->vtype)
q += snprintf(q, sizeof(vpidbuf) - (q - vpidbuf), "=%d", Channel->vtype);
*q = 0;
const int BufferSize = (MAXAPIDS + MAXDPIDS) * (5 + 1 + MAXLANGCODE2) + 10; // 5 digits plus delimiting ',' or ';' plus optional '=cod+cod', +10: paranoia
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: config.h 2.6 2009/01/06 16:56:27 kls Exp $
* $Id: config.h 2.7 2009/01/30 16:05:34 kls Exp $
*/
#ifndef __CONFIG_H
......@@ -22,13 +22,13 @@
// VDR's own version number:
#define VDRVERSION "1.7.4"
#define VDRVERSNUM 10704 // Version * 10000 + Major * 100 + Minor
#define VDRVERSION "1.7.5"
#define VDRVERSNUM 10705 // Version * 10000 + Major * 100 + Minor
// The plugin API's version number:
#define APIVERSION "1.7.4"
#define APIVERSNUM 10704 // Version * 10000 + Major * 100 + Minor
#define APIVERSION "1.7.5"
#define APIVERSNUM 10705 // Version * 10000 + Major * 100 + Minor
// When loading plugins, VDR searches them by their APIVERSION, which
// may be smaller than VDRVERSION in case there have been no changes to
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: device.c 2.11 2009/01/25 11:10:56 kls Exp $
* $Id: device.c 2.13 2009/04/05 12:15:41 kls Exp $
*/
#include "device.h"
......@@ -1304,8 +1304,9 @@ int cDevice::PlayTsSubtitle(const uchar *Data, int Length)
if (!dvbSubtitleConverter)
dvbSubtitleConverter = new cDvbSubtitleConverter;
tsToPesSubtitle.PutTs(Data, Length);
if (const uchar *p = tsToPesSubtitle.GetPes(Length)) {
dvbSubtitleConverter->Convert(p, Length);
int l;
if (const uchar *p = tsToPesSubtitle.GetPes(l)) {
dvbSubtitleConverter->Convert(p, l);
tsToPesSubtitle.Reset();
}
return Length;
......@@ -1314,43 +1315,54 @@ int cDevice::PlayTsSubtitle(const uchar *Data, int Length)
//TODO detect and report continuity errors?
int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
{
if (Length == TS_SIZE) {
if (!TsHasPayload(Data))
return Length; // silently ignore TS packets w/o payload
int PayloadOffset = TsPayloadOffset(Data);
if (PayloadOffset < Length) {
cMutexLock MutexLock(&mutexCurrentAudioTrack);
int Pid = TsPid(Data);
if (Pid == 0)
patPmtParser.ParsePat(Data, Length);
else if (Pid == patPmtParser.PmtPid())
patPmtParser.ParsePmt(Data, Length);
else if (Pid == patPmtParser.Vpid()) {
isPlayingVideo = true;
return PlayTsVideo(Data, Length);
}
else if (Pid == availableTracks[currentAudioTrack].id) {
if (!VideoOnly || HasIBPTrickSpeed()) {
int w = PlayTsAudio(Data, Length);
if (w > 0)
Audios.PlayTsAudio(Data, Length);
return w;
}
}
else if (Pid == availableTracks[currentSubtitleTrack].id) {
if (!VideoOnly || HasIBPTrickSpeed())
return PlayTsSubtitle(Data, Length);
}
return Length;
}
}
else if (Data == NULL) {
int Played = 0;
if (Data == NULL) {
patPmtParser.Reset();
tsToPesVideo.Reset();
tsToPesAudio.Reset();
tsToPesSubtitle.Reset();
}
return -1;
else {
cMutexLock MutexLock(&mutexCurrentAudioTrack);
while (Length >= TS_SIZE) {
if (TsHasPayload(Data)) { // silently ignore TS packets w/o payload
int PayloadOffset = TsPayloadOffset(Data);
if (PayloadOffset < TS_SIZE) {
int Pid = TsPid(Data);
if (Pid == 0)
patPmtParser.ParsePat(Data, TS_SIZE);
else if (Pid == patPmtParser.PmtPid())
patPmtParser.ParsePmt(Data, TS_SIZE);
else if (Pid == patPmtParser.Vpid()) {
isPlayingVideo = true;
int w = PlayTsVideo(Data, TS_SIZE);
if (w < 0)
return Played ? Played : w;
if (w == 0)
break;
}
else if (Pid == availableTracks[currentAudioTrack].id) {
if (!VideoOnly || HasIBPTrickSpeed()) {
int w = PlayTsAudio(Data, TS_SIZE);
if (w < 0)
return Played ? Played : w;
if (w == 0)
break;
Audios.PlayTsAudio(Data, TS_SIZE);
}
}
else if (Pid == availableTracks[currentSubtitleTrack].id) {
if (!VideoOnly || HasIBPTrickSpeed())
PlayTsSubtitle(Data, TS_SIZE);
}
}
}
Played += TS_SIZE;
Length -= TS_SIZE;
Data += TS_SIZE;
}
}
return Played;
}
int cDevice::Priority(void) const
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: device.h 2.6 2009/01/25 11:04:39 kls Exp $
* $Id: device.h 2.9 2009/04/05 12:12:44 kls Exp $
*/
#ifndef __DEVICE_H
......@@ -543,6 +543,13 @@ public:
///< Gets the current System Time Counter, which can be used to
///< synchronize audio and video. If this device is unable to
///< provide the STC, -1 will be returned.
///< The value returned doesn't need to be an actual "clock" value,
///< it is sufficient if it holds the PTS (Presentation Time Stamp) of
///< the most recently presented frame. A proper value must be returned
///< in normal replay mode as well as in any trick modes (like slow motion,
///< fast forward/rewind).
///< Only the lower 32 bit of this value are actually used, since some
///< devices can't handle the msb correctly.
virtual bool IsPlayingVideo(void) const { return isPlayingVideo; }
///< \return Returns true if the currently attached player has delivered
///< any video packets.
......@@ -588,7 +595,7 @@ public:
///< data which was bufferd so far has been processed.
///< If TimeoutMs is not zero, the device will wait up to the given
///< number of milliseconds before returning in case there is still
///< data in the buffers..
///< data in the buffers.
virtual int PlayPes(const uchar *Data, int Length, bool VideoOnly = false);
///< Plays all valid PES packets in Data with the given Length.
///< If Data is NULL any leftover data from a previous call will be
......@@ -612,9 +619,9 @@ public:
///< must be sent to the base class function. This applies especially
///< to the PAT/PMT packets.
///< Returns -1 in case of error, otherwise the number of actually
///< processed bytes is returned, which must be Length.
///< PlayTs() shall process the packet either as a whole (returning
///< Length) or not at all returning 0 or -1 and setting 'errno' accordingly).
///< processed bytes is returned.
///< PlayTs() shall process the TS packets either as a whole (returning
///< n*TS_SIZE) or not at all, returning 0 or -1 and setting 'errno' accordingly).
bool Replaying(void) const;
///< Returns true if we are currently replaying.
bool Transferring(void) const;
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: dvbdevice.c 2.12 2009/01/10 10:07:33 kls Exp $
* $Id: dvbdevice.c 2.14 2009/04/10 09:54:24 kls Exp $
*/
#include "dvbdevice.h"
......@@ -1172,8 +1172,10 @@ void cDvbDevice::Play(void)
CHECK(ioctl(fd_audio, AUDIO_CONTINUE));
}
else {
if (fd_audio >= 0)
if (fd_audio >= 0) {
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
CHECK(ioctl(fd_audio, AUDIO_CONTINUE));
}
if (fd_video >= 0)
CHECK(ioctl(fd_video, VIDEO_CONTINUE));
}
......@@ -1187,8 +1189,10 @@ void cDvbDevice::Freeze(void)
CHECK(ioctl(fd_audio, AUDIO_PAUSE));
}
else {
if (fd_audio >= 0)
if (fd_audio >= 0) {
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
CHECK(ioctl(fd_audio, AUDIO_PAUSE));
}
if (fd_video >= 0)
CHECK(ioctl(fd_video, VIDEO_FREEZE));
}
......@@ -1206,6 +1210,8 @@ void cDvbDevice::Mute(void)
void cDvbDevice::StillPicture(const uchar *Data, int Length)
{
if (!Data || Length < TS_SIZE)
return;
if (Data[0] == 0x47) {
// TS data
cDevice::StillPicture(Data, Length);
......
This diff is collapsed.
......@@ -8,7 +8,7 @@
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
* Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
*
* $Id: eit.c 2.2 2008/05/01 15:33:27 kls Exp $
* $Id: eit.c 2.3 2009/04/11 10:03:24 kls Exp $
*/
#include "eit.h"
......@@ -42,20 +42,25 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
bool HasExternalData = false;
time_t SegmentStart = 0;
time_t SegmentEnd = 0;
time_t Now = time(NULL);
struct tm tm_r;
struct tm t = *localtime_r(&Now, &tm_r); // this initializes the time zone in 't'
SI::EIT::Event SiEitEvent;
for (SI::Loop::Iterator it; eventLoop.getNext(SiEitEvent, it); ) {
bool ExternalData = false;
int StartTime = SiEitEvent.getStartTime();
int Duration = SiEitEvent.getDuration();
// Drop bogus events - but keep NVOD reference events, where all bits of the start time field are set to 1, resulting in a negative number.
if (SiEitEvent.getStartTime() == 0 || SiEitEvent.getStartTime() > 0 && SiEitEvent.getDuration() == 0)
if (StartTime == 0 || StartTime > 0 && Duration == 0)
continue;
Empty = false;
if (!SegmentStart)
SegmentStart = SiEitEvent.getStartTime();
SegmentEnd = SiEitEvent.getStartTime() + SiEitEvent.getDuration();
SegmentStart = StartTime;
SegmentEnd = StartTime + Duration;
cEvent *newEvent = NULL;
cEvent *rEvent = NULL;
cEvent *pEvent = (cEvent *)pSchedule->GetEvent(SiEitEvent.getEventId(), SiEitEvent.getStartTime());
cEvent *pEvent = (cEvent *)pSchedule->GetEvent(SiEitEvent.getEventId(), StartTime);
if (!pEvent) {
if (OnlyRunningStatus)
continue;
......@@ -70,14 +75,15 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
pEvent->SetSeen();
// If the existing event has a zero table ID it was defined externally and shall
// not be overwritten.
if (pEvent->TableID() == 0x00) {
uchar TableID = pEvent->TableID();
if (TableID == 0x00) {
if (pEvent->Version() == getVersionNumber())
continue;
HasExternalData = ExternalData = true;
}
// If the new event has a higher table ID, let's skip it.
// The lower the table ID, the more "current" the information.
else if (Tid > pEvent->TableID())
else if (Tid > TableID)
continue;
// If the new event comes from the same table and has the same version number
// as the existing one, let's skip it to avoid unnecessary work.
......@@ -85,14 +91,14 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
// the actual Premiere transponder and the Sat.1/Pro7 transponder), but use different version numbers on
// each of them :-( So if one DVB card is tuned to the Premiere transponder, while an other one is tuned
// to the Sat.1/Pro7 transponder, events will keep toggling because of the bogus version numbers.
else if (Tid == pEvent->TableID() && pEvent->Version() == getVersionNumber())
else if (Tid == TableID && pEvent->Version() == getVersionNumber())
continue;
}
if (!ExternalData) {
pEvent->SetEventID(SiEitEvent.getEventId()); // unfortunately some stations use different event ids for the same event in different tables :-(
pEvent->SetTableID(Tid);
pEvent->SetStartTime(SiEitEvent.getStartTime());
pEvent->SetDuration(SiEitEvent.getDuration());
pEvent->SetStartTime(StartTime);
pEvent->SetDuration(Duration);
}
if (newEvent)
pSchedule->AddEvent(newEvent);
......@@ -148,9 +154,6 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
break;
case SI::PDCDescriptorTag: {
SI::PDCDescriptor *pd = (SI::PDCDescriptor *)d;
time_t now = time(NULL);
struct tm tm_r;
struct tm t = *localtime_r(&now, &tm_r); // this initializes the time zone in 't'
t.tm_isdst = -1; // makes sure mktime() will determine the correct DST setting
int month = t.tm_mon;
t.tm_mon = pd->getMonth() - 1;
......@@ -183,8 +186,7 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
SI::LinkageDescriptor *ld = (SI::LinkageDescriptor *)d;
tChannelID linkID(Source, ld->getOriginalNetworkId(), ld->getTransportStreamId(), ld->getServiceId());
if (ld->getLinkageType() == 0xB0) { // Premiere World
time_t now = time(NULL);
bool hit = SiEitEvent.getStartTime() <= now && now < SiEitEvent.getStartTime() + SiEitEvent.getDuration();
bool hit = StartTime <= Now && Now < StartTime + Duration;
if (hit) {
char linkName[ld->privateData.getLength() + 1];
strn0cpy(linkName, (const char *)ld->privateData.getData(), sizeof(linkName));
......@@ -260,11 +262,12 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
channel->SetLinkChannels(LinkChannels);
Modified = true;
}
if (Empty && Tid == 0x4E && getSectionNumber() == 0)
// ETR 211: an empty entry in section 0 of table 0x4E means there is currently no event running
pSchedule->ClrRunningStatus(channel);
if (Tid == 0x4E)
if (Tid == 0x4E) {
if (Empty && getSectionNumber() == 0)
// ETR 211: an empty entry in section 0 of table 0x4E means there is currently no event running
pSchedule->ClrRunningStatus(channel);
pSchedule->SetPresentSeen();
}
if (OnlyRunningStatus)
return;
if (Modified) {
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: menuitems.c 2.2 2008/12/13 11:35:31 kls Exp $
* $Id: menuitems.c 2.3 2009/04/05 10:15:12 kls Exp $
*/
#include "menuitems.h"
......@@ -271,9 +271,9 @@ cMenuEditStrItem::cMenuEditStrItem(const char *Name, char *Value, int Length, co
cMenuEditStrItem::~cMenuEditStrItem()
{
delete valueUtf8;
delete allowedUtf8;
delete charMapUtf8;
delete[] valueUtf8;
delete[] allowedUtf8;
delete[] charMapUtf8;
}
void cMenuEditStrItem::EnterEditMode(void)
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: osd.c 2.1 2009/01/16 14:34:32 kls Exp $
* $Id: osd.c 2.2 2009/04/05 10:17:25 kls Exp $
*/
#include "osd.h"
......@@ -24,6 +24,10 @@ cPalette::cPalette(int Bpp)
SetAntiAliasGranularity(10, 10);
}
cPalette::~cPalette()
{
}
void cPalette::SetAntiAliasGranularity(uint FixedColors, uint BlendColors)
{
if (FixedColors >= MAXNUMCOLORS || BlendColors == 0)
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: osd.h 2.1 2009/01/16 14:37:03 kls Exp $
* $Id: osd.h 2.2 2009/04/05 10:16:05 kls Exp $
*/
#ifndef __OSD_H
......@@ -62,6 +62,7 @@ protected:
public:
cPalette(int Bpp = 8);
///< Initializes the palette with the given color depth.
virtual ~cPalette();
void SetAntiAliasGranularity(uint FixedColors, uint BlendColors);
///< Allows the system to optimize utilization of the limited color
///< palette entries when generating blended colors for anti-aliasing.
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: player.h 2.3 2009/01/25 11:03:44 kls Exp $
* $Id: player.h 2.4 2009/03/08 12:29:10 kls Exp $
*/
#ifndef __PLAYER_H
......@@ -34,6 +34,7 @@ protected:
void DeviceMute(void) { if (device) device->Mute(); }
void DeviceSetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat) { if (device) device->SetVideoDisplayFormat(VideoDisplayFormat); }
void DeviceStillPicture(const uchar *Data, int Length) { if (device) device->StillPicture(Data, Length); }
uint64_t DeviceGetSTC(void) { return device ? device->GetSTC() : -1; }
void Detach(void);
virtual void Activate(bool On) {}
// This function is called right after the cPlayer has been attached to
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: plugin.c 2.0 2008/02/17 13:32:12 kls Exp $
* $Id: plugin.c 2.1 2009/04/05 10:16:48 kls Exp $
*/
#include "plugin.h"
......@@ -137,6 +137,7 @@ void cPlugin::RegisterI18n(const void *)
void cPlugin::SetConfigDirectory(const char *Dir)
{
free(configDirectory);
configDirectory = strdup(Dir);
}
......
......@@ -12,18 +12,21 @@ msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2008-12-14 16:10+0100\n"
"PO-Revision-Date: 2008-08-25 02:36+0100\n"
"PO-Revision-Date: 2009-02-08 18:58+0100\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: Italian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-Language: Italian\n"
"X-Poedit-Country: ITALY\n"
"X-Poedit-SourceCharset: utf-8\n"
msgid "off"
msgstr "off"
msgid "on"
msgstr ""
msgstr "on"
msgid "auto"
msgstr "automatico"
......@@ -58,7 +61,7 @@ msgid "Phase 1: Detecting RC code type"
msgstr "Fase 1: Rilevamento tipo codice RC"
msgid "Press any key on the RC unit"
msgstr "Premi un tasto dell'unit RC"
msgstr "Premi un tasto dell'unità RC"
msgid "RC code detected!"
msgstr "Codice RC rilevato!"
......@@ -77,13 +80,13 @@ msgid "Press 'Up' to confirm"
msgstr "Premi 'Su' per confermare"
msgid "Press 'Down' to continue"
msgstr "Premi 'Gi' per continuare"
msgstr "Premi 'Giù' per continuare"
msgid "(press 'Up' to go back)"
msgstr "(premi 'Su' per tornare indietro)"
msgid "(press 'Down' to end key definition)"
msgstr "(premi 'Gi' per concludere definizione tasti)"
msgstr "(premi 'Giù' per concludere definizione tasti)"
msgid "(press 'Menu' to skip this key)"
msgstr "(premi 'Menu' per saltare questo tasto)"
......@@ -95,13 +98,13 @@ msgid "Phase 3: Saving key codes"
msgstr "Fase 3: Salvataggio codici tasti"
msgid "Press 'Up' to save, 'Down' to cancel"
msgstr "Premi 'Su' per salvare, 'Gi' per annullare"
msgstr "Premi 'Su' per salvare, 'Giù' per annullare"
msgid "Key$Up"
msgstr "Su"
msgid "Key$Down"
msgstr "Gi"
msgstr "Giù"
msgid "Key$Menu"
msgstr "Menu"
......@@ -290,7 +293,7 @@ msgid "Polarization"
msgstr "Polarizzazione"
msgid "System"
msgstr ""
msgstr "Sistema"
msgid "Srate"
msgstr "SymbolRate"
......@@ -320,7 +323,7 @@ msgid "Hierarchy"
msgstr "Gerarchia"
msgid "Rolloff"
msgstr ""
msgstr "Rolloff"
msgid "Channel settings are not unique!"
msgstr "Parametri canale non univoci!"
......@@ -368,7 +371,7 @@ msgid "VPS"
msgstr "VPS"
msgid "Priority"
msgstr "Priorit"
msgstr "Priorità"
msgid "Lifetime"
msgstr "Scadenza"
......@@ -377,7 +380,7 @@ msgid "File"
msgstr "Nome"
msgid "First day"
msgstr "1 giorno"
msgstr "1° giorno"
msgid "Timers"
msgstr "Timer"
......@@ -682,10 +685,10 @@ msgid "CAM reset"
msgstr "Reimposta la CAM"
msgid "CAM present"
msgstr "La CAM presente"
msgstr "La CAM è presente"
msgid "CAM ready"
msgstr "La CAM pronta"
msgstr "La CAM è pronta"
msgid "CAM"
msgstr "Accesso condizionato CAM"
......@@ -703,7 +706,7 @@ msgid "Can't open CAM menu!"
msgstr "Impossibile aprire il menu CAM!"
msgid "CAM is in use - really reset?"
msgstr "La CAM in uso - vuoi reimpostarla?"
msgstr "La CAM è in uso - vuoi reimpostarla?"
msgid "Can't reset CAM!"
msgstr "Impossibile reimpostare il modulo CAM!"
......@@ -721,13 +724,13 @@ msgid "Setup.Recording$Primary limit"
msgstr "Limite primario"
msgid "Setup.Recording$Default priority"
msgstr "Priorit predefinita"
msgstr "Priorità predefinita"
msgid "Setup.Recording$Default lifetime (d)"
msgstr "Scadenza predefinita (gg)"
msgid "Setup.Recording$Pause priority"
msgstr "Priorit di pausa"
msgstr "Priorità di pausa"
msgid "Setup.Recording$Pause lifetime (d)"
msgstr "Scadenza pausa (gg)"
......@@ -760,10 +763,10 @@ msgid "Replay"
msgstr "Riproduzione"
msgid "Setup.Replay$Multi speed mode"
msgstr "Modalit multispeed"
msgstr "Modalità multispeed"
msgid "Setup.Replay$Show replay mode"
msgstr "Mostra modalit riproduzione"
msgstr "Mostra modalità riproduzione"
msgid "Setup.Replay$Resume ID"
msgstr "ID di ripristino"
......@@ -775,7 +778,7 @@ msgid "Setup.Miscellaneous$Min. event timeout (min)"
msgstr "Scadenza min. evento (min)"
msgid "Setup.Miscellaneous$Min. user inactivity (min)"
msgstr "Periodo min. inattivit (min)"
msgstr "Periodo min. inattività (min)"
msgid "Setup.Miscellaneous$SVDRP timeout (s)"
msgstr "Scadenza SVDRP (s)"
......@@ -884,16 +887,16 @@ msgid "Editing process started"
msgstr "Processo di modifica avviato"
msgid "Editing process already active!"
msgstr "Processo di modifica gi attivo!"
msgstr "Processo di modifica già attivo!"
msgid "FileNameChars$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&"
msgstr " abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&"
msgstr " aáàbcdeéèfghiìîjklmnoòpqrstuùvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&°"
msgid "yes"
msgstr "s"
msgstr "sì"
msgid "CharMap$ 0\t-.,1#~\\^$[]|()*+?{}/:%@&\tabc2\tdef3\tghi4\tjkl5\tmno6\tpqrs7\ttuv8\twxyz9"
msgstr " 0\t-.,1#~\\^$[]|()*+?{}/:%@&\tabc2\tdef3\tghi4\tjkl5\tmno6\tpqrs7\ttuv8\twxyz9"
msgstr " 0\t-.,1#~\\^$[]|()*+°?{}/:%@&\taàbc2\tdeèf3\tghiì4\tjkl5\tmnoò6\tpqrs7\ttuùv8\twxyz9"
msgid "Button$ABC/abc"
msgstr "ABC/abc"
......@@ -908,7 +911,7 @@ msgid "Plugin"
msgstr "Plugin"
msgid "Up/Dn for new location - OK to move"
msgstr "Su/Gi per nuova posizione - OK per spostare"
msgstr "Su/Giù per nuova posizione - OK per spostare"
msgid "Channel locked (recording)!"
msgstr "Canale bloccato (in registrazione)!"
......@@ -964,19 +967,19 @@ msgid "MonTueWedThuFriSatSun"
msgstr "LunMarMerGioVenSabDom"
msgid "Monday"
msgstr "Luned"
msgstr "Lunedì"
msgid "Tuesday"
msgstr "Marted"