summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTORS28
-rw-r--r--HISTORY31
-rw-r--r--INSTALL5
-rw-r--r--channels.c28
-rw-r--r--channels.conf1
-rw-r--r--channels.conf.terr30
-rw-r--r--channels.h4
-rw-r--r--config.h4
-rw-r--r--cutter.c9
-rw-r--r--device.h4
-rw-r--r--dvbdevice.c12
-rw-r--r--dvbplayer.c14
-rw-r--r--eit.c27
-rw-r--r--interface.c5
-rw-r--r--lirc.c20
-rw-r--r--menu.c15
-rw-r--r--remote.h3
-rw-r--r--remux.c18
-rw-r--r--remux.h3
-rw-r--r--ringbuffer.c14
-rw-r--r--ringbuffer.h12
-rw-r--r--svdrp.c22
-rw-r--r--svdrp.h3
-rw-r--r--timers.c4
-rw-r--r--vdr.55
25 files changed, 239 insertions, 82 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index d05b928..37394db 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -169,6 +169,8 @@ Stefan Huelswitt <huels@iname.com>
for adapting VDR to 'libdtv' version 0.0.5
for reporting a bug in handling of Ca parameters with values <= MAXDEVICES, which
don't indicate an actual encrypted channel
+ for implementing setting the "broken link" flag for GOPs at the beginning of a new
+ video sequence, which avoids artefacts when cutting
Ulrich Röder <roeder@efr-net.de>
for pointing out that there are channels that have a symbol rate higher than
@@ -197,6 +199,7 @@ Andreas Schultz <aschultz@warp10.net>
cMenuRecordings::Del(), which caused warnings with gcc-3.2
for suggesting a Make.config file
for making EIT filtering use masks to reduce the number of filters
+ for suggesting to remove the Mute() call from cDvbDevice::StillPicture()
Aaron Holtzman
for writing 'ac3dec'
@@ -548,11 +551,12 @@ Walter Stroebel <walter.stroebel@lifeline.nl>
Paul Gohn <pgohn@nexgo.de>
for adding 'Hrvatska radiotelevizija' and 'RTV Slovenija' to ca.conf
-Teemu Rantanen <tvr@iki.fi>
+Teemu Rantanen <teemu.rantanen@tekla.com>
for increased the maximum possible packet size in remux.c to avoid corrupted streams
with broadcasters that send extremely large PES packets
for adding TS error checking to remux.c
for pinpointing a problem with excessive memmove() calls in 'Transfer Mode'
+ for fixing faulty calculation of section length in eit.c
Jan Ekholm <chakie@infa.abo.fi>
for adding/improving some Swedish language OSD texts
@@ -589,6 +593,28 @@ Ludwig Nussel <ludwig.nussel@web.de>
Thomas Koch <tom@harhar.net>
for his support in keeping the Premiere World channels up to date in 'channels.conf'
+ for implementing the SVDRP command STAT
Stefan Hußfeldt <vdr@marvin.on-luebeck.de>
for his help in keeping 'channels.conf.cable' up to date
+
+Christoph Friederich <christoph.friederich@gmx.de>
+ for reporting a bug in deleting the last recording in the "Recordings" menu, which
+ started pausing live video
+
+Andreas Brachold <andy03@deltab.de>
+ for his support in keeping 'channels.conf.terr' up to date
+
+Manuel Hartl <icecep@gmx.net>
+ for suggesting to extend the logging info when starting/stopping timers
+
+Benjamin Harling <benjamin.harling@web.de>
+ for suggesting to add a note regarding non-VDR files in the /videoX directories to
+ INSTALL
+
+Christian Jacobsen <christian.jacobsen@stageholding.de>
+ for making the LIRC interface skip keys that come in too fast
+
+Andreas Mair <Andreas.Mair@linogate.com>
+ for reporting a short display of the main menu if a plugin displays its own OSD and
+ is started through a user defined key macro
diff --git a/HISTORY b/HISTORY
index 439e064..16c7447 100644
--- a/HISTORY
+++ b/HISTORY
@@ -2053,3 +2053,34 @@ Video Disk Recorder Revision History
- Implemented "pause live video". You can now press "Menu/Yellow" or "Pause" on
your remote control while watching live video to start an instant recording
of the current programme and immediately start replaying that recording.
+
+2003-04-27: Version 1.1.29
+
+- Fixed detecting broken connection to the LIRC daemon (thanks to Ludwig Nussel).
+- Now sending CA descriptors to the CAM in the same sequence as they were originally
+ received (thanks to Stefan Huelswitt).
+- The PCR PID can now be set separately from the video PID. The syntax in the
+ 'channels.conf' file is, for example, ...:164+17:..., where 164 is the video PID
+ and 17 is the PCR PID. The separator is a '+' sign, not a comma or semicolon as
+ with the audio PIDs, because this is not an alternate PID, but rather an
+ additional, necessary PID. In order to use this feature you need a driver version
+ dated 2003-04-27 or higher (setting the PCR PID didn't work in earlier versions).
+- Fixed deleting the last recording in the "Recordings" menu, which started pausing
+ live video (thanks to Christoph Friederich for reporting this one).
+- Now setting the "broken link" flag for GOPs at the beginning of a new video
+ sequence, which avoids artefacts when cutting (thanks to Stefan Huelswitt).
+- Removed the Mute() call from cDvbDevice::StillPicture() (suggested by Andreas
+ Schultz).
+- Updated 'channels.conf.terr' for Berlin (thanks to Andreas Brachold).
+- Extended logging info when starting/stopping timers to show the channel number,
+ start/stop time and the file name (suggested by Manuel Hartl).
+- Added a note regarding non-VDR files in the /videoX directories to INSTALL
+ (suggested by Benjamin Harling).
+- Skipping keys that come in too fast from LIRC (thanks to Christian Jacobsen).
+- Avoiding short display of the main menu if a plugin displays its own OSD and
+ is started through a user defined key macro (thanks to Andreas Mair for reporting
+ this one).
+- Reduced the time to wait for EPG data when starting a recording to 3 seconds.
+- The new SVDRP command STAT can be used to request information about the disk
+ usage (thanks to Thomas Koch).
+- Fixed faulty calculation of section length in eit.c (thanks to Teemu Rantanen).
diff --git a/INSTALL b/INSTALL
index ce5420a..11efa22 100644
--- a/INSTALL
+++ b/INSTALL
@@ -278,6 +278,11 @@ with the name of the basic directory when running 'vdr':
vdr -v /video0
+Note that you should not copy any non-VDR files into the /videoX directories,
+since this might cause the watchdog timer to expire when VDR cleans up those
+directories and there is a large number of files and/or subdirectories in
+there.
+
Configuration files:
--------------------
diff --git a/channels.c b/channels.c
index 1e3d9c7..c68b4ee 100644
--- a/channels.c
+++ b/channels.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: channels.c 1.11 2002/11/29 14:10:46 kls Exp $
+ * $Id: channels.c 1.12 2003/04/26 09:57:48 kls Exp $
*/
#include "channels.h"
@@ -164,6 +164,7 @@ cChannel::cChannel(void)
source = cSource::FromString("S19.2E");
srate = 27500;
vpid = 255;
+ ppid = 0;
apid1 = 256;
apid2 = 0;
dpid1 = 257;
@@ -286,8 +287,14 @@ const char *cChannel::ToText(cChannel *Channel)
asprintf(&buffer, ":%s\n", s);
}
else {
+ char vpidbuf[32];
+ char *q = vpidbuf;
+ q += snprintf(q, sizeof(vpidbuf), "%d", Channel->vpid);
+ if (Channel->ppid)
+ q += snprintf(q, sizeof(vpidbuf) - (q - vpidbuf), "+%d", Channel->ppid);
+ *q = 0;
char apidbuf[32];
- char *q = apidbuf;
+ q = apidbuf;
q += snprintf(q, sizeof(apidbuf), "%d", Channel->apid1);
if (Channel->apid2)
q += snprintf(q, sizeof(apidbuf) - (q - apidbuf), ",%d", Channel->apid2);
@@ -296,7 +303,7 @@ const char *cChannel::ToText(cChannel *Channel)
if (Channel->dpid2)
q += snprintf(q, sizeof(apidbuf) - (q - apidbuf), ",%d", Channel->dpid2);
*q = 0;
- asprintf(&buffer, "%s:%d:%s:%s:%d:%d:%s:%d:%d:%d:%d:%d:%d\n", s, Channel->frequency, Channel->ParametersToString(), cSource::ToString(Channel->source), Channel->srate, Channel->vpid, apidbuf, Channel->tpid, Channel->ca, Channel->sid, Channel->nid, Channel->tid, Channel->rid);
+ asprintf(&buffer, "%s:%d:%s:%s:%d:%s:%s:%d:%d:%d:%d:%d:%d\n", s, Channel->frequency, Channel->ParametersToString(), cSource::ToString(Channel->source), Channel->srate, vpidbuf, apidbuf, Channel->tpid, Channel->ca, Channel->sid, Channel->nid, Channel->tid, Channel->rid);
}
return buffer;
}
@@ -326,8 +333,9 @@ bool cChannel::Parse(const char *s, bool AllowNonUniqueID)
char *namebuf = NULL;
char *sourcebuf = NULL;
char *parambuf = NULL;
+ char *vpidbuf = NULL;
char *apidbuf = NULL;
- int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%d :%a[^:]:%d :%d :%d :%d :%d :%d ", &namebuf, &frequency, &parambuf, &sourcebuf, &srate, &vpid, &apidbuf, &tpid, &ca, &sid, &nid, &tid, &rid);
+ int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%d :%d :%d :%d :%d :%d ", &namebuf, &frequency, &parambuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpid, &ca, &sid, &nid, &tid, &rid);
if (fields >= 9) {
if (fields == 9) {
// allow reading of old format
@@ -335,12 +343,19 @@ bool cChannel::Parse(const char *s, bool AllowNonUniqueID)
ca = tpid;
tpid = 0;
}
+ vpid = ppid = 0;
apid1 = apid2 = 0;
dpid1 = dpid2 = 0;
bool ok = false;
- if (parambuf && sourcebuf && apidbuf) {
+ if (parambuf && sourcebuf && vpidbuf && apidbuf) {
ok = StringToParameters(parambuf) && (source = cSource::FromString(sourcebuf)) >= 0;
- char *p = strchr(apidbuf, ';');
+ char *p = strchr(vpidbuf, '+');
+ if (p)
+ *p++ = 0;
+ sscanf(vpidbuf, "%d", &vpid);
+ if (p)
+ sscanf(p, "%d", &ppid);
+ p = strchr(apidbuf, ';');
if (p)
*p++ = 0;
sscanf(apidbuf, "%d ,%d ", &apid1, &apid2);
@@ -350,6 +365,7 @@ bool cChannel::Parse(const char *s, bool AllowNonUniqueID)
strn0cpy(name, namebuf, MaxChannelName);
free(parambuf);
free(sourcebuf);
+ free(vpidbuf);
free(apidbuf);
free(namebuf);
if (!AllowNonUniqueID && Channels.GetByChannelID(GetChannelID())) {
diff --git a/channels.conf b/channels.conf
index 13bc7e7..3909757 100644
--- a/channels.conf
+++ b/channels.conf
@@ -31,6 +31,7 @@ Bloomberg TV France:11817:v:S19.2E:27500:163:92:0:0:8004:0:0:0
Bloomberg TV Spain:12168:v:S19.2E:27500:167:112:0:0:12721:0:0:0
Sky News:11597:v:S19.2E:22000:305:306:0:0:28707:0:0:0
Fox Kids Netherlands:12574:h:S19.2E:22000:163:92:0:0:5020:0:0:0
+BVN:12574:h:S19.2E:22000:164+131:96:0:0:5025:0:0:0
Alice:12610:v:S19.2E:22000:162:96:0:0:12200:0:0:0
n-tv:12670:v:S19.2E:22000:162:96:55:0:12730:0:0:0
Al Jazeera:11568:v:S19.2E:22000:55:56:0:0:9021:0:0:0
diff --git a/channels.conf.terr b/channels.conf.terr
index b618319..548f021 100644
--- a/channels.conf.terr
+++ b/channels.conf.terr
@@ -46,14 +46,22 @@ KISS (RADIO):537833:I0C34D0M16B8T2G32Y0:T:27500:0:1101:0:0:26176:0:0:0
oneword (RADIO):537833:I0C34D0M16B8T2G32Y0:T:27500:0:1501:0:0:26432:0:0:0
Smash Hits! (RADIO):537833:I0C34D0M16B8T2G32Y0:T:27500:0:1201:0:0:26240:0:0:0
: DVB-T Berlin Germany
-PRO 7:658000:I0C23D0M16B8T8G8Y0:T:27500:305:306;307:0:0:16403:0:0:0
-SAT 1:658000:I0C23D0M16B8T8G8Y0:T:27500:385:386:0:0:16408:0:0:0
-RTL:658000:I0C23D0M16B8T8G8Y0:T:27500:337:338:0:0:16405:0:0:0
-RTL 2:658000:I0C23D0M16B8T8G8Y0:T:27500:353:354:0:0:16406:0:0:0
-Super RTL:778000:I0C23D0M16B8T8G8Y0:T:27500:433:434:0:0:16411:0:0:0
-VOX:778000:I0C23D0M16B8T8G8Y0:T:27500:545:546:0:0:16418:0:0:0
-KABEL 1:778000:I0C23D0M16B8T8G8Y0:T:27500:161:162:0:0:16394:0:0:0
-MTV:650000:I0C23D0M16B8T2G8Y0:T:27500:193:194:0:0:16396:0:0:0
-N-TV:650000:I0C23D0M16B8T2G8Y0:T:27500:273:274:0:0:16401:0:0:0
-N24:778000:I0C23D0M16B8T8G8Y0:T:27500:225:226:0:0:16398:0:0:0
-FAB:650000:I0C23D0M16B8T2G8Y0:T:27500:3073:3074:0:0:16576:0:0:0
+RTL:506000:I0C23D0M16B8T8G8Y0:T:27500:337:338:343:0:16405:0:0:0
+RTL2:506000:I0C23D0M16B8T8G8Y0:T:27500:353:354:359:0:16406:0:0:0
+Super RTL:506000:I0C23D0M16B8T8G8Y0:T:27500:433:434:439:0:16411:0:0:0
+VOX:506000:I0C23D0M16B8T8G8Y0:T:27500:545:546:551:0:16418:0:0:0
+ORB-Fernsehen:522000:I0C23D0M16B8T8G8Y0:T:27500:1101:1102:1104:0:11:0:0:0
+SFB1:522000:I0C23D0M16B8T8G8Y0:T:27500:1201:1202:1204:0:12:0:0:0
+Phoenix:522000:I0C23D0M16B8T8G8Y0:T:27500:1301:1302:1304:0:13:0:0:0
+Das Erste:522000:I0C23D0M16B8T8G8Y0:T:27500:1401:1402:1404:0:14:0:0:0
+ZDF:570000:I0C23D0M16B8T8G8Y0:T:27500:545:546:551:0:514:0:0:0
+ZDFinfokanal:570000:I0C23D0M16B8T8G8Y0:T:27500:561:562:551:0:515:0:0:0
+ZDFdokukanal:570000:I0C23D0M16B8T8G8Y0:T:27500:577:578:551:0:516:0:0:0
+KiKa:570000:I0C23D0M16B8T8G8Y0:T:27500:593:594:599:0:517:0:0:0
+Kabel 1:658000:I0C23D0M16B8T8G8Y0:T:27500:161:162:163:0:16394:0:0:0
+N24:658000:I0C23D0M16B8T8G8Y0:T:27500:225:226:227:0:16398:0:0:0
+ProSieben:658000:I0C23D0M16B8T8G8Y0:T:27500:305:306;307:308:0:16403:0:0:0
+SAT.1:658000:I0C23D0M16B8T8G8Y0:T:27500:385:386:387:0:16408:0:0:0
+MTV:778000:I0C23D0M16B8T8G8Y0:T:27500:193:194:199:0:16396:0:0:0
+n-tv:778000:I0C23D0M16B8T8G8Y0:T:27500:273:274:279:0:16401:0:0:0
+Eurosport:778000:I0C23D0M16B8T8G8Y0:T:27500:577:578:583:0:16420:0:0:0
diff --git a/channels.h b/channels.h
index b21ed30..c82fc28 100644
--- a/channels.h
+++ b/channels.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: channels.h 1.6 2002/11/30 12:59:05 kls Exp $
+ * $Id: channels.h 1.7 2003/04/26 09:15:40 kls Exp $
*/
#ifndef __CHANNELS_H
@@ -65,6 +65,7 @@ private:
int source;
int srate;
int vpid;
+ int ppid;
int apid1, apid2;
int dpid1, dpid2;
int tpid;
@@ -98,6 +99,7 @@ public:
int Source(void) const { return source; }
int Srate(void) const { return srate; }
int Vpid(void) const { return vpid; }
+ int Ppid(void) const { return ppid; }
int Apid1(void) const { return apid1; }
int Apid2(void) const { return apid2; }
int Dpid1(void) const { return dpid1; }
diff --git a/config.h b/config.h
index 94bdcd7..e56689f 100644
--- a/config.h
+++ b/config.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: config.h 1.153 2003/04/13 14:02:02 kls Exp $
+ * $Id: config.h 1.154 2003/04/21 16:23:15 kls Exp $
*/
#ifndef __CONFIG_H
@@ -19,7 +19,7 @@
#include "device.h"
#include "tools.h"
-#define VDRVERSION "1.1.28"
+#define VDRVERSION "1.1.29"
#define MAXPRIORITY 99
#define MAXLIFETIME 99
diff --git a/cutter.c b/cutter.c
index 234201c..5ce0a2c 100644
--- a/cutter.c
+++ b/cutter.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: cutter.c 1.2 2002/08/11 11:09:23 kls Exp $
+ * $Id: cutter.c 1.3 2003/04/26 15:11:17 kls Exp $
*/
#include "cutter.h"
@@ -77,6 +77,7 @@ void cCuttingThread::Action(void)
toMarks.Add(0);
toMarks.Save();
uchar buffer[MAXFRAMESIZE];
+ bool cutIn = true;
while (active) {
uchar FileNumber;
int FileOffset, Length;
@@ -126,6 +127,11 @@ void cCuttingThread::Action(void)
FileSize = 0;
}
LastIFrame = 0;
+
+ if (cutIn) {
+ cRemux::SetBrokenLink(buffer, Length);
+ cutIn = false;
+ }
}
if (safe_write(toFile, buffer, Length) < 0) {
error = "safe_write";
@@ -151,6 +157,7 @@ void cCuttingThread::Action(void)
Index = Mark->position;
Mark = fromMarks.Next(Mark);
CurrentFileNumber = 0; // triggers SetOffset before reading next frame
+ cutIn = true;
if (Setup.SplitEditedFiles) {
toFile = toFileName->NextFile();
if (toFile < 0) {
diff --git a/device.h b/device.h
index ad876ba..8ffd495 100644
--- a/device.h
+++ b/device.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: device.h 1.29 2003/01/03 15:43:48 kls Exp $
+ * $Id: device.h 1.30 2003/04/26 09:49:12 kls Exp $
*/
#ifndef __DEVICE_H
@@ -188,7 +188,7 @@ private:
bool active;
virtual void Action(void);
protected:
- enum ePidType { ptAudio, ptVideo, ptTeletext, ptDolby, ptOther };
+ enum ePidType { ptAudio, ptVideo, ptPcr, ptTeletext, ptDolby, ptOther };
class cPidHandle {
public:
int pid;
diff --git a/dvbdevice.c b/dvbdevice.c
index c25ebef..d66cd76 100644
--- a/dvbdevice.c
+++ b/dvbdevice.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: dvbdevice.c 1.54 2003/04/19 14:24:25 kls Exp $
+ * $Id: dvbdevice.c 1.56 2003/04/27 09:44:17 kls Exp $
*/
#include "dvbdevice.h"
@@ -524,8 +524,8 @@ void cDvbDevice::SetVideoFormat(bool VideoFormat16_9)
CHECK(ioctl(fd_video, VIDEO_SET_FORMAT, VideoFormat16_9 ? VIDEO_FORMAT_16_9 : VIDEO_FORMAT_4_3));
}
-// ptAudio ptVideo ptTeletext ptDolby ptOther
-dmx_pes_type_t PesTypes[] = { DMX_PES_AUDIO, DMX_PES_VIDEO, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER };
+// ptAudio ptVideo ptPcr ptTeletext ptDolby ptOther
+dmx_pes_type_t PesTypes[] = { DMX_PES_AUDIO, DMX_PES_VIDEO, DMX_PES_PCR, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER };
bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On)
{
@@ -662,6 +662,7 @@ bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
DelPid(pidHandles[ptAudio].pid);
DelPid(pidHandles[ptVideo].pid);
+ DelPid(pidHandles[ptPcr].pid);
DelPid(pidHandles[ptTeletext].pid);
DelPid(pidHandles[ptDolby].pid);
}
@@ -683,7 +684,7 @@ bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
if (TurnOnLivePIDs) {
aPid1 = Channel->Apid1();
aPid2 = Channel->Apid2();
- if (!(AddPid(Channel->Apid1(), ptAudio) && AddPid(Channel->Vpid(), ptVideo))) {//XXX+ dolby dpid1!!! (if audio plugins are attached)
+ if (!(AddPid(Channel->Ppid(), ptPcr) && AddPid(Channel->Apid1(), ptAudio) && AddPid(Channel->Vpid(), ptVideo))) {//XXX+ dolby dpid1!!! (if audio plugins are attached)
esyslog("ERROR: failed to set PIDs for channel %d on device %d", Channel->Number(), CardIndex() + 1);
return false;
}
@@ -870,7 +871,6 @@ void cDvbDevice::Mute(void)
void cDvbDevice::StillPicture(const uchar *Data, int Length)
{
- Mute();
/* Using the VIDEO_STILLPICTURE ioctl call would be the
correct way to display a still frame, but unfortunately this
doesn't work with frames from VDR. So let's do pretty much the
@@ -882,7 +882,7 @@ void cDvbDevice::StillPicture(const uchar *Data, int Length)
*/
//#define VIDEO_STILLPICTURE_WORKS_WITH_VDR_FRAMES
#ifdef VIDEO_STILLPICTURE_WORKS_WITH_VDR_FRAMES
- videoDisplayStillPicture sp = { (char *)Data, Length };
+ video_still_picture sp = { (char *)Data, Length };
CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp));
#else
#define MIN_IFRAME 400000
diff --git a/dvbplayer.c b/dvbplayer.c
index f71c69c..afd4278 100644
--- a/dvbplayer.c
+++ b/dvbplayer.c
@@ -4,12 +4,13 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: dvbplayer.c 1.19 2003/03/30 12:51:51 kls Exp $
+ * $Id: dvbplayer.c 1.20 2003/04/27 09:55:53 kls Exp $
*/
#include "dvbplayer.h"
#include <stdlib.h>
#include "recording.h"
+#include "remux.h"
#include "ringbuffer.h"
#include "thread.h"
#include "tools.h"
@@ -190,6 +191,7 @@ private:
bool eof;
bool active;
bool running;
+ bool firstPacket;
ePlayModes playMode;
ePlayDirs playDir;
int trickSpeed;
@@ -197,7 +199,7 @@ private:
bool canToggleAudioTrack;
uchar audioTrack;
cFrame *readFrame;
- const cFrame *playFrame;
+ cFrame *playFrame;
void TrickSpeed(int Increment);
void Empty(void);
void StripAudioPackets(uchar *b, int Length, uchar Except = 0x00);
@@ -240,6 +242,7 @@ cDvbPlayer::cDvbPlayer(const char *FileName)
eof = false;
active = true;
running = false;
+ firstPacket = true;
playMode = pmPlay;
playDir = pdForward;
trickSpeed = NORMAL_SPEED;
@@ -307,6 +310,7 @@ void cDvbPlayer::Empty(void)
ringBuffer->Clear();
backTrace->Clear();
DeviceClear();
+ firstPacket = true;
}
void cDvbPlayer::StripAudioPackets(uchar *b, int Length, uchar Except)
@@ -403,7 +407,7 @@ void cDvbPlayer::Action(void)
dsyslog("dvbplayer thread started (pid=%d)", getpid());
uchar *b = NULL;
- const uchar *p = NULL;
+ uchar *p = NULL;
int pc = 0;
readIndex = Resume();
@@ -510,6 +514,10 @@ void cDvbPlayer::Action(void)
if (!p) {
p = playFrame->Data();
pc = playFrame->Count();
+ if (firstPacket) {
+ cRemux::SetBrokenLink(p, pc);
+ firstPacket = false;
+ }
}
if (p) {
int w = PlayVideo(p, pc);
diff --git a/eit.c b/eit.c
index 2bab1a5..9b2442c 100644
--- a/eit.c
+++ b/eit.c
@@ -16,7 +16,7 @@
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
- * $Id: eit.c 1.72 2003/04/21 13:21:54 kls Exp $
+ * $Id: eit.c 1.74 2003/04/27 14:41:36 kls Exp $
***************************************************************************/
#include "eit.h"
@@ -1232,7 +1232,7 @@ void cSIProcessor::Action()
int r = safe_read(filters[a].handle, buf, sizeof(buf));
if (r > 3) // minimum number of bytes necessary to get section length
{
- int seclen = ((buf[1] & 0x0F) << 8) | (buf[2] & 0xFF) + 3;
+ int seclen = (((buf[1] & 0x0F) << 8) | (buf[2] & 0xFF)) + 3;
int pid = filters[a].pid;
if (seclen == r)
{
@@ -1444,18 +1444,21 @@ int cSIProcessor::GetCaDescriptors(int Source, int Transponder, int ServiceId, c
if (BufSize > 0 && Data) {
cMutexLock MutexLock(&caDescriptorsMutex);
int length = 0;
- do {
- for (cCaDescriptor *d = caDescriptors.First(); d; d = caDescriptors.Next(d)) {
- if (d->source == Source && d->transponder == Transponder && d->serviceId == ServiceId && d->caSystem == *CaSystemIds) {
- if (length + d->Length() <= BufSize) {
- memcpy(Data + length, d->Data(), d->Length());
- length += d->Length();
+ for (cCaDescriptor *d = caDescriptors.First(); d; d = caDescriptors.Next(d)) {
+ if (d->source == Source && d->transponder == Transponder && d->serviceId == ServiceId) {
+ const unsigned short *caids = CaSystemIds;
+ do {
+ if (d->caSystem == *caids) {
+ if (length + d->Length() <= BufSize) {
+ memcpy(Data + length, d->Data(), d->Length());
+ length += d->Length();
+ }
+ else
+ return -1;
}
- else
- return -1;
- }
+ } while (*++caids);
}
- } while (*++CaSystemIds);
+ }
return length;
}
return -1;
diff --git a/interface.c b/interface.c
index 9245c85..6431f91 100644
--- a/interface.c
+++ b/interface.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: interface.c 1.63 2003/04/12 14:17:49 kls Exp $
+ * $Id: interface.c 1.64 2003/04/27 12:08:52 kls Exp $
*/
#include "interface.h"
@@ -56,7 +56,8 @@ void cInterface::Close(void)
eKeys cInterface::GetKey(bool Wait)
{
- Flush();
+ if (!cRemote::HasKeys())
+ Flush();
if (SVDRP) {
if (SVDRP->Process())
Wait = false;
diff --git a/lirc.c b/lirc.c
index b7f5b93..0774cf8 100644
--- a/lirc.c
+++ b/lirc.c
@@ -6,7 +6,7 @@
*
* LIRC support added by Carsten Koch <Carsten.Koch@icem.de> 2000-06-16.
*
- * $Id: lirc.c 1.4 2003/04/12 14:37:17 kls Exp $
+ * $Id: lirc.c 1.6 2003/04/27 11:39:47 kls Exp $
*/
#include "lirc.h"
@@ -16,6 +16,7 @@
#define REPEATLIMIT 20 // ms
#define REPEATDELAY 350 // ms
+#define KEYPRESSDELAY 150 // ms
cLircRemote::cLircRemote(char *DeviceName)
:cRemote("LIRC")
@@ -64,18 +65,21 @@ void cLircRemote::Action(void)
bool ready = cFile::FileReady(f, timeout);
int ret = ready ? safe_read(f, buf, sizeof(buf)) : -1;
- if (ready) {
- if (ret <= 21) {
- esyslog("ERROR: lircd connection lost");
- close(f);
- f = -1;
- break;
- }
+ if (ready && ret <= 0 ) {
+ esyslog("ERROR: lircd connection lost");
+ close(f);
+ f = -1;
+ break;
+ }
+
+ if (ready && ret > 21) {
int count;
char KeyName[LIRC_KEY_BUF];
sscanf(buf, "%*x %x %29s", &count, KeyName); // '29' in '%29s' is LIRC_KEY_BUF-1!
int Now = time_ms();
if (count == 0) {
+ if (strcmp(KeyName, LastKeyName) == 0 && Now - FirstTime < KEYPRESSDELAY)
+ continue; // skip keys coming in too fast
if (repeat)
Put(LastKeyName, false, true);
strcpy(LastKeyName, KeyName);
diff --git a/menu.c b/menu.c
index 4b7136b..341480a 100644
--- a/menu.c
+++ b/menu.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: menu.c 1.237 2003/04/21 14:57:13 kls Exp $
+ * $Id: menu.c 1.240 2003/04/27 12:50:31 kls Exp $
*/
#include "menu.h"
@@ -28,7 +28,7 @@
#include "videodir.h"
#define MENUTIMEOUT 120 // seconds
-#define MAXWAIT4EPGINFO 10 // seconds
+#define MAXWAIT4EPGINFO 3 // seconds
#define MODETIMEOUT 3 // seconds
#define MAXRECORDCONTROLS (MAXDEVICES * MAXRECEIVERS)
@@ -575,6 +575,7 @@ void cMenuEditChannel::Setup(void)
Add(new cMenuEditSrcItem( tr("Source"), &data.source));
Add(new cMenuEditIntItem( tr("Frequency"), &data.frequency));
Add(new cMenuEditIntItem( tr("Vpid"), &data.vpid, 0, 0x1FFF));
+ Add(new cMenuEditIntItem( tr("Ppid"), &data.ppid, 0, 0x1FFF));
Add(new cMenuEditIntItem( tr("Apid1"), &data.apid1, 0, 0x1FFF));
Add(new cMenuEditIntItem( tr("Apid2"), &data.apid2, 0, 0x1FFF));
Add(new cMenuEditIntItem( tr("Dpid1"), &data.dpid1, 0, 0x1FFF));
@@ -2495,8 +2496,10 @@ void cMenuMain::Set(const char *Plugin)
eOSState cMenuMain::ProcessKey(eKeys Key)
{
+ bool HadSubMenu = HasSubMenu();
int osdLanguage = Setup.OSDLanguage;
eOSState state = cOsdMenu::ProcessKey(Key);
+ HadSubMenu |= HasSubMenu();
switch (state) {
case osSchedule: return AddSubMenu(new cMenuSchedule);
@@ -2543,10 +2546,10 @@ eOSState cMenuMain::ProcessKey(eKeys Key)
break;
default: switch (Key) {
case kRecord:
- case kRed: if (!HasSubMenu())
+ case kRed: if (!HadSubMenu)
state = osRecord;
break;
- case kGreen: if (!HasSubMenu()) {
+ case kGreen: if (!HadSubMenu) {
int CurrentAudioTrack = -1;
const char **AudioTracks = cDevice::PrimaryDevice()->GetAudioTracks(&CurrentAudioTrack);
if (AudioTracks) {
@@ -2560,10 +2563,10 @@ eOSState cMenuMain::ProcessKey(eKeys Key)
}
}
break;
- case kYellow: if (!HasSubMenu())
+ case kYellow: if (!HadSubMenu)
state = osPause;
break;
- case kBlue: if (!HasSubMenu())
+ case kBlue: if (!HadSubMenu)
state = replaying ? osStopReplay : cReplayControl::LastReplayed() ? osReplay : osContinue;
break;
default: break;
diff --git a/remote.h b/remote.h
index f26be16..9ff9566 100644
--- a/remote.h
+++ b/remote.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: remote.h 1.25 2003/04/12 14:14:49 kls Exp $
+ * $Id: remote.h 1.26 2003/04/27 12:05:48 kls Exp $
*/
#ifndef __REMOTE_H
@@ -45,6 +45,7 @@ public:
static bool Put(eKeys Key);
static bool PutMacro(eKeys Key);
static const char *GetPlugin(void) { return plugin; }
+ static bool HasKeys(void) { return in != out; }
static eKeys Get(int WaitMs = 1000, char **UnknownCode = NULL);
};
diff --git a/remux.c b/remux.c
index 097b4a5..c2ded24 100644
--- a/remux.c
+++ b/remux.c
@@ -8,7 +8,7 @@
* the Linux DVB driver's 'tuxplayer' example and were rewritten to suit
* VDR's needs.
*
- * $Id: remux.c 1.14 2003/01/24 17:22:29 kls Exp $
+ * $Id: remux.c 1.15 2003/04/26 15:07:41 kls Exp $
*/
/* The calling interface of the 'cRemux::Process()' function is defined
@@ -621,6 +621,7 @@ XXX*/
else if (!synced) {
if (pt == I_FRAME) {
resultDelivered = i; // will drop everything before this position
+ SetBrokenLink(resultBuffer + i, l);
synced = true;
}
else {
@@ -667,3 +668,18 @@ XXX*/
return NULL; // no useful data found, wait for more
}
+void cRemux::SetBrokenLink(uchar *Data, int Length)
+{
+ if (Length > 9 && Data[0] == 0 && Data[1] == 0 && Data[2] == 1 && (Data[3] & VIDEO_STREAM_S) == VIDEO_STREAM_S) {
+ for (int i = Data[8] + 9; i < Length - 7; i++) { // +9 to skip video packet header
+ if (Data[i] == 0 && Data[i + 1] == 0 && Data[i + 2] == 1 && Data[i + 3] == 0xB8) {
+ if (!(Data[i + 7] & 0x40)) // set flag only if GOP is not closed
+ Data[i + 7] |= 0x20;
+ return;
+ }
+ }
+ dsyslog("SetBrokenLink: no GOP header found in video packet");
+ }
+ else
+ dsyslog("SetBrokenLink: no video packet in frame");
+}
diff --git a/remux.h b/remux.h
index 638a3f9..e953001 100644
--- a/remux.h
+++ b/remux.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: remux.h 1.9 2002/11/01 10:06:46 kls Exp $
+ * $Id: remux.h 1.10 2003/04/26 14:13:11 kls Exp $
*/
#ifndef __REMUX_H
@@ -44,6 +44,7 @@ public:
cRemux(int VPid, int APid1, int APid2, int DPid1, int DPid2, bool ExitOnFailure = false);
~cRemux();
uchar *Process(const uchar *Data, int &Count, int &Result, uchar *PictureType = NULL);
+ static void SetBrokenLink(uchar *Data, int Length);
};
#endif // __REMUX_H
diff --git a/ringbuffer.c b/ringbuffer.c
index 9eecbba..6913c71 100644
--- a/ringbuffer.c
+++ b/ringbuffer.c
@@ -7,7 +7,7 @@
* Parts of this file were inspired by the 'ringbuffy.c' from the
* LinuxDVB driver (see linuxtv.org).
*
- * $Id: ringbuffer.c 1.14 2003/02/15 13:21:50 kls Exp $
+ * $Id: ringbuffer.c 1.15 2003/04/27 09:54:32 kls Exp $
*/
#include "ringbuffer.h"
@@ -142,9 +142,9 @@ int cRingBufferLinear::Put(const uchar *Data, int Count)
return Count;
}
-const uchar *cRingBufferLinear::Get(int &Count)
+uchar *cRingBufferLinear::Get(int &Count)
{
- const uchar *p = NULL;
+ uchar *p = NULL;
Lock();
if (getThreadPid < 0)
getThreadPid = getpid();
@@ -224,7 +224,7 @@ cRingBufferFrame::~cRingBufferFrame()
void cRingBufferFrame::Clear(void)
{
Lock();
- const cFrame *p;
+ cFrame *p;
while ((p = Get()) != NULL)
Drop(p);
Unlock();
@@ -252,7 +252,7 @@ bool cRingBufferFrame::Put(cFrame *Frame)
return false;
}
-const cFrame *cRingBufferFrame::Get(void)
+cFrame *cRingBufferFrame::Get(void)
{
Lock();
cFrame *p = head ? head->next : NULL;
@@ -260,13 +260,13 @@ const cFrame *cRingBufferFrame::Get(void)
return p;
}
-void cRingBufferFrame::Delete(const cFrame *Frame)
+void cRingBufferFrame::Delete(cFrame *Frame)
{
currentFill -= Frame->Count();
delete Frame;
}
-void cRingBufferFrame::Drop(const cFrame *Frame)
+void cRingBufferFrame::Drop(cFrame *Frame)
{
Lock();
if (head) {
diff --git a/ringbuffer.h b/ringbuffer.h
index 9205df7..0ce0a48 100644
--- a/ringbuffer.h
+++ b/ringbuffer.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: ringbuffer.h 1.9 2003/01/26 09:47:39 kls Exp $
+ * $Id: ringbuffer.h 1.10 2003/04/27 09:55:08 kls Exp $
*/
#ifndef __RINGBUFFER_H
@@ -56,7 +56,7 @@ public:
int Put(const uchar *Data, int Count);
///< Puts at most Count bytes of Data into the ring buffer.
///< \return Returns the number of bytes actually stored.
- const uchar *Get(int &Count);
+ uchar *Get(int &Count);
///< Gets data from the ring buffer.
///< The data will remain in the buffer until a call to Del() deletes it.
///< \return Returns a pointer to the data, and stores the number of bytes
@@ -83,7 +83,7 @@ public:
///< If Count is negative, the cFrame object will take ownership of the given
///< Data. Otherwise it will allocate Count bytes of memory and copy Data.
~cFrame();
- const uchar *Data(void) const { return data; }
+ uchar *Data(void) const { return data; }
int Count(void) const { return count; }
eFrameType Type(void) const { return type; }
int Index(void) const { return index; }
@@ -93,7 +93,7 @@ class cRingBufferFrame : public cRingBuffer {
private:
cFrame *head;
int currentFill;
- void Delete(const cFrame *Frame);
+ void Delete(cFrame *Frame);
public:
cRingBufferFrame(int Size, bool Statistics = false);
virtual ~cRingBufferFrame();
@@ -103,10 +103,10 @@ public:
bool Put(cFrame *Frame);
// Puts the Frame into the ring buffer.
// Returns true if this was possible.
- const cFrame *Get(void);
+ cFrame *Get(void);
// Gets the next frame from the ring buffer.
// The actual data still remains in the buffer until Drop() is called.
- void Drop(const cFrame *Frame);
+ void Drop(cFrame *Frame);
// Drops the Frame that has just been fetched with Get().
};
diff --git a/svdrp.c b/svdrp.c
index 102abe0..6dafddd 100644
--- a/svdrp.c
+++ b/svdrp.c
@@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection.
*
- * $Id: svdrp.c 1.50 2002/12/22 14:04:08 kls Exp $
+ * $Id: svdrp.c 1.51 2003/04/27 14:21:07 kls Exp $
*/
#include "svdrp.h"
@@ -33,6 +33,7 @@
#include "remote.h"
#include "timers.h"
#include "tools.h"
+#include "videodir.h"
// --- cSocket ---------------------------------------------------------------
@@ -250,6 +251,8 @@ const char *HelpPages[] = {
" format defined in vdr(5) for the 'epg.data' file. A '.' on a line\n"
" by itself terminates the input and starts processing of the data (all\n"
" entered data is buffered until the terminating '.' is seen).",
+ "STAT disk\n"
+ " Return information about disk usage (total, free, percent).",
"UPDT <settings>\n"
" Updates a timer. Settings must be in the same format as returned\n"
" by the LSTT command. If a timer with the same channel, day, start\n"
@@ -929,6 +932,22 @@ void cSVDRP::CmdPUTE(const char *Option)
DELETENULL(PUTEhandler);
}
+void cSVDRP::CmdSTAT(const char *Option)
+{
+ if (*Option) {
+ if (strcasecmp(Option, "DISK") == 0) {
+ int FreeMB;
+ int Percent = VideoDiskSpace(&FreeMB);
+ int Total = (FreeMB / (100 - Percent)) * 100;
+ Reply(250, "%dMB %dMB %d%%", Total, FreeMB, Percent);
+ }
+ else
+ Reply(501, "Invalid Option \"%s\"", Option);
+ }
+ else
+ Reply(501, "No option given");
+}
+
void cSVDRP::CmdUPDT(const char *Option)
{
if (*Option) {
@@ -1021,6 +1040,7 @@ void cSVDRP::Execute(char *Cmd)
else if (CMD("NEWT")) CmdNEWT(s);
else if (CMD("NEXT")) CmdNEXT(s);
else if (CMD("PUTE")) CmdPUTE(s);
+ else if (CMD("STAT")) CmdSTAT(s);
else if (CMD("UPDT")) CmdUPDT(s);
else if (CMD("VOLU")) CmdVOLU(s);
else if (CMD("QUIT")) Close();
diff --git a/svdrp.h b/svdrp.h
index 1052d63..67918ed 100644
--- a/svdrp.h
+++ b/svdrp.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: svdrp.h 1.18 2002/11/30 14:36:04 kls Exp $
+ * $Id: svdrp.h 1.19 2003/04/27 14:09:59 kls Exp $
*/
#ifndef __SVDRP_H
@@ -73,6 +73,7 @@ private:
void CmdNEWT(const char *Option);
void CmdNEXT(const char *Option);
void CmdPUTE(const char *Option);
+ void CmdSTAT(const char *Option);
void CmdUPDT(const char *Option);
void CmdVOLU(const char *Option);
void Execute(char *Cmd);
diff --git a/timers.c b/timers.c
index 8e2bead..8c982e2 100644
--- a/timers.c
+++ b/timers.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: timers.c 1.3 2002/11/24 14:29:21 kls Exp $
+ * $Id: timers.c 1.4 2003/04/27 11:11:45 kls Exp $
*/
#include "timers.h"
@@ -336,7 +336,7 @@ time_t cTimer::StopTime(void)
void cTimer::SetRecording(bool Recording)
{
recording = Recording;
- isyslog("timer %d %s", Index() + 1, recording ? "start" : "stop");
+ isyslog("timer %d (%d %04d-%04d '%s') %s", Index() + 1, Channel()->Number(), start, stop, file, recording ? "start" : "stop");
}
void cTimer::SetPending(bool Pending)
diff --git a/vdr.5 b/vdr.5
index 8b833a2..513bd5d 100644
--- a/vdr.5
+++ b/vdr.5
@@ -8,7 +8,7 @@
.\" License as specified in the file COPYING that comes with the
.\" vdr distribution.
.\"
-.\" $Id: vdr.5 1.17 2002/12/08 14:35:12 kls Exp $
+.\" $Id: vdr.5 1.18 2003/04/26 11:54:35 kls Exp $
.\"
.TH vdr 5 "6 Dec 2002" "1.2.0" "Video Disk Recorder Files"
.SH NAME
@@ -105,6 +105,9 @@ The symbol rate of this channel (DVB-S and DVB-C only).
.TP
.B VPID
The video PID (set to '0' for radio channels, '1' for encrypted radio channels).
+If this channel uses a separate PCR PID, it follows the VPID, separated by a
+plus sign, as in
+.B ...:164+17:...
.TP
.B APID
The audio PID (either one number, or two, separated by a comma).