mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
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).
This commit is contained in:
parent
21a52ccb6d
commit
0686038af3
28
CONTRIBUTORS
28
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
|
||||
|
31
HISTORY
31
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).
|
||||
|
5
INSTALL
5
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:
|
||||
--------------------
|
||||
|
||||
|
28
channels.c
28
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, ¶mbuf, &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, ¶mbuf, &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())) {
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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; }
|
||||
|
4
config.h
4
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
|
||||
|
9
cutter.c
9
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) {
|
||||
|
4
device.h
4
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;
|
||||
|
12
dvbdevice.c
12
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
|
||||
|
14
dvbplayer.c
14
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);
|
||||
|
27
eit.c
27
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;
|
||||
|
@ -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;
|
||||
|
20
lirc.c
20
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);
|
||||
|
15
menu.c
15
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;
|
||||
|
3
remote.h
3
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);
|
||||
};
|
||||
|
||||
|
18
remux.c
18
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");
|
||||
}
|
||||
|
3
remux.h
3
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
|
||||
|
14
ringbuffer.c
14
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) {
|
||||
|
12
ringbuffer.h
12
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().
|
||||
};
|
||||
|
||||
|
22
svdrp.c
22
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();
|
||||
|
3
svdrp.h
3
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);
|
||||
|
4
timers.c
4
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)
|
||||
|
5
vdr.5
5
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).
|
||||
|
Loading…
x
Reference in New Issue
Block a user