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 adapting VDR to 'libdtv' version 0.0.5
|
||||||
for reporting a bug in handling of Ca parameters with values <= MAXDEVICES, which
|
for reporting a bug in handling of Ca parameters with values <= MAXDEVICES, which
|
||||||
don't indicate an actual encrypted channel
|
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>
|
Ulrich Röder <roeder@efr-net.de>
|
||||||
for pointing out that there are channels that have a symbol rate higher than
|
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
|
cMenuRecordings::Del(), which caused warnings with gcc-3.2
|
||||||
for suggesting a Make.config file
|
for suggesting a Make.config file
|
||||||
for making EIT filtering use masks to reduce the number of filters
|
for making EIT filtering use masks to reduce the number of filters
|
||||||
|
for suggesting to remove the Mute() call from cDvbDevice::StillPicture()
|
||||||
|
|
||||||
Aaron Holtzman
|
Aaron Holtzman
|
||||||
for writing 'ac3dec'
|
for writing 'ac3dec'
|
||||||
@ -548,11 +551,12 @@ Walter Stroebel <walter.stroebel@lifeline.nl>
|
|||||||
Paul Gohn <pgohn@nexgo.de>
|
Paul Gohn <pgohn@nexgo.de>
|
||||||
for adding 'Hrvatska radiotelevizija' and 'RTV Slovenija' to ca.conf
|
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
|
for increased the maximum possible packet size in remux.c to avoid corrupted streams
|
||||||
with broadcasters that send extremely large PES packets
|
with broadcasters that send extremely large PES packets
|
||||||
for adding TS error checking to remux.c
|
for adding TS error checking to remux.c
|
||||||
for pinpointing a problem with excessive memmove() calls in 'Transfer Mode'
|
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>
|
Jan Ekholm <chakie@infa.abo.fi>
|
||||||
for adding/improving some Swedish language OSD texts
|
for adding/improving some Swedish language OSD texts
|
||||||
@ -589,6 +593,28 @@ Ludwig Nussel <ludwig.nussel@web.de>
|
|||||||
|
|
||||||
Thomas Koch <tom@harhar.net>
|
Thomas Koch <tom@harhar.net>
|
||||||
for his support in keeping the Premiere World channels up to date in 'channels.conf'
|
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>
|
Stefan Hußfeldt <vdr@marvin.on-luebeck.de>
|
||||||
for his help in keeping 'channels.conf.cable' up to date
|
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
|
- 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
|
your remote control while watching live video to start an instant recording
|
||||||
of the current programme and immediately start replaying that 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
|
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:
|
Configuration files:
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
|
28
channels.c
28
channels.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: 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"
|
#include "channels.h"
|
||||||
@ -164,6 +164,7 @@ cChannel::cChannel(void)
|
|||||||
source = cSource::FromString("S19.2E");
|
source = cSource::FromString("S19.2E");
|
||||||
srate = 27500;
|
srate = 27500;
|
||||||
vpid = 255;
|
vpid = 255;
|
||||||
|
ppid = 0;
|
||||||
apid1 = 256;
|
apid1 = 256;
|
||||||
apid2 = 0;
|
apid2 = 0;
|
||||||
dpid1 = 257;
|
dpid1 = 257;
|
||||||
@ -286,8 +287,14 @@ const char *cChannel::ToText(cChannel *Channel)
|
|||||||
asprintf(&buffer, ":%s\n", s);
|
asprintf(&buffer, ":%s\n", s);
|
||||||
}
|
}
|
||||||
else {
|
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 apidbuf[32];
|
||||||
char *q = apidbuf;
|
q = apidbuf;
|
||||||
q += snprintf(q, sizeof(apidbuf), "%d", Channel->apid1);
|
q += snprintf(q, sizeof(apidbuf), "%d", Channel->apid1);
|
||||||
if (Channel->apid2)
|
if (Channel->apid2)
|
||||||
q += snprintf(q, sizeof(apidbuf) - (q - apidbuf), ",%d", 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)
|
if (Channel->dpid2)
|
||||||
q += snprintf(q, sizeof(apidbuf) - (q - apidbuf), ",%d", Channel->dpid2);
|
q += snprintf(q, sizeof(apidbuf) - (q - apidbuf), ",%d", Channel->dpid2);
|
||||||
*q = 0;
|
*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;
|
return buffer;
|
||||||
}
|
}
|
||||||
@ -326,8 +333,9 @@ bool cChannel::Parse(const char *s, bool AllowNonUniqueID)
|
|||||||
char *namebuf = NULL;
|
char *namebuf = NULL;
|
||||||
char *sourcebuf = NULL;
|
char *sourcebuf = NULL;
|
||||||
char *parambuf = NULL;
|
char *parambuf = NULL;
|
||||||
|
char *vpidbuf = NULL;
|
||||||
char *apidbuf = 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) {
|
||||||
if (fields == 9) {
|
if (fields == 9) {
|
||||||
// allow reading of old format
|
// allow reading of old format
|
||||||
@ -335,12 +343,19 @@ bool cChannel::Parse(const char *s, bool AllowNonUniqueID)
|
|||||||
ca = tpid;
|
ca = tpid;
|
||||||
tpid = 0;
|
tpid = 0;
|
||||||
}
|
}
|
||||||
|
vpid = ppid = 0;
|
||||||
apid1 = apid2 = 0;
|
apid1 = apid2 = 0;
|
||||||
dpid1 = dpid2 = 0;
|
dpid1 = dpid2 = 0;
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
if (parambuf && sourcebuf && apidbuf) {
|
if (parambuf && sourcebuf && vpidbuf && apidbuf) {
|
||||||
ok = StringToParameters(parambuf) && (source = cSource::FromString(sourcebuf)) >= 0;
|
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)
|
if (p)
|
||||||
*p++ = 0;
|
*p++ = 0;
|
||||||
sscanf(apidbuf, "%d ,%d ", &apid1, &apid2);
|
sscanf(apidbuf, "%d ,%d ", &apid1, &apid2);
|
||||||
@ -350,6 +365,7 @@ bool cChannel::Parse(const char *s, bool AllowNonUniqueID)
|
|||||||
strn0cpy(name, namebuf, MaxChannelName);
|
strn0cpy(name, namebuf, MaxChannelName);
|
||||||
free(parambuf);
|
free(parambuf);
|
||||||
free(sourcebuf);
|
free(sourcebuf);
|
||||||
|
free(vpidbuf);
|
||||||
free(apidbuf);
|
free(apidbuf);
|
||||||
free(namebuf);
|
free(namebuf);
|
||||||
if (!AllowNonUniqueID && Channels.GetByChannelID(GetChannelID())) {
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
Smash Hits! (RADIO):537833:I0C34D0M16B8T2G32Y0:T:27500:0:1201:0:0:26240:0:0:0
|
||||||
: DVB-T Berlin Germany
|
: DVB-T Berlin Germany
|
||||||
PRO 7:658000:I0C23D0M16B8T8G8Y0:T:27500:305:306;307:0:0:16403:0:0:0
|
RTL:506000:I0C23D0M16B8T8G8Y0:T:27500:337:338:343:0:16405:0:0:0
|
||||||
SAT 1:658000:I0C23D0M16B8T8G8Y0:T:27500:385:386:0:0:16408:0:0:0
|
RTL2:506000:I0C23D0M16B8T8G8Y0:T:27500:353:354:359:0:16406:0:0:0
|
||||||
RTL:658000:I0C23D0M16B8T8G8Y0:T:27500:337:338:0:0:16405:0:0:0
|
Super RTL:506000:I0C23D0M16B8T8G8Y0:T:27500:433:434:439:0:16411:0:0:0
|
||||||
RTL 2:658000:I0C23D0M16B8T8G8Y0:T:27500:353:354:0:0:16406:0:0:0
|
VOX:506000:I0C23D0M16B8T8G8Y0:T:27500:545:546:551:0:16418:0:0:0
|
||||||
Super RTL:778000:I0C23D0M16B8T8G8Y0:T:27500:433:434:0:0:16411:0:0:0
|
ORB-Fernsehen:522000:I0C23D0M16B8T8G8Y0:T:27500:1101:1102:1104:0:11:0:0:0
|
||||||
VOX:778000:I0C23D0M16B8T8G8Y0:T:27500:545:546:0:0:16418:0:0:0
|
SFB1:522000:I0C23D0M16B8T8G8Y0:T:27500:1201:1202:1204:0:12:0:0:0
|
||||||
KABEL 1:778000:I0C23D0M16B8T8G8Y0:T:27500:161:162:0:0:16394:0:0:0
|
Phoenix:522000:I0C23D0M16B8T8G8Y0:T:27500:1301:1302:1304:0:13:0:0:0
|
||||||
MTV:650000:I0C23D0M16B8T2G8Y0:T:27500:193:194:0:0:16396:0:0:0
|
Das Erste:522000:I0C23D0M16B8T8G8Y0:T:27500:1401:1402:1404:0:14:0:0:0
|
||||||
N-TV:650000:I0C23D0M16B8T2G8Y0:T:27500:273:274:0:0:16401:0:0:0
|
ZDF:570000:I0C23D0M16B8T8G8Y0:T:27500:545:546:551:0:514:0:0:0
|
||||||
N24:778000:I0C23D0M16B8T8G8Y0:T:27500:225:226:0:0:16398:0:0:0
|
ZDFinfokanal:570000:I0C23D0M16B8T8G8Y0:T:27500:561:562:551:0:515:0:0:0
|
||||||
FAB:650000:I0C23D0M16B8T2G8Y0:T:27500:3073:3074:0:0:16576: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
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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
|
#ifndef __CHANNELS_H
|
||||||
@ -65,6 +65,7 @@ private:
|
|||||||
int source;
|
int source;
|
||||||
int srate;
|
int srate;
|
||||||
int vpid;
|
int vpid;
|
||||||
|
int ppid;
|
||||||
int apid1, apid2;
|
int apid1, apid2;
|
||||||
int dpid1, dpid2;
|
int dpid1, dpid2;
|
||||||
int tpid;
|
int tpid;
|
||||||
@ -98,6 +99,7 @@ public:
|
|||||||
int Source(void) const { return source; }
|
int Source(void) const { return source; }
|
||||||
int Srate(void) const { return srate; }
|
int Srate(void) const { return srate; }
|
||||||
int Vpid(void) const { return vpid; }
|
int Vpid(void) const { return vpid; }
|
||||||
|
int Ppid(void) const { return ppid; }
|
||||||
int Apid1(void) const { return apid1; }
|
int Apid1(void) const { return apid1; }
|
||||||
int Apid2(void) const { return apid2; }
|
int Apid2(void) const { return apid2; }
|
||||||
int Dpid1(void) const { return dpid1; }
|
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
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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
|
#ifndef __CONFIG_H
|
||||||
@ -19,7 +19,7 @@
|
|||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
|
|
||||||
#define VDRVERSION "1.1.28"
|
#define VDRVERSION "1.1.29"
|
||||||
|
|
||||||
#define MAXPRIORITY 99
|
#define MAXPRIORITY 99
|
||||||
#define MAXLIFETIME 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
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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"
|
#include "cutter.h"
|
||||||
@ -77,6 +77,7 @@ void cCuttingThread::Action(void)
|
|||||||
toMarks.Add(0);
|
toMarks.Add(0);
|
||||||
toMarks.Save();
|
toMarks.Save();
|
||||||
uchar buffer[MAXFRAMESIZE];
|
uchar buffer[MAXFRAMESIZE];
|
||||||
|
bool cutIn = true;
|
||||||
while (active) {
|
while (active) {
|
||||||
uchar FileNumber;
|
uchar FileNumber;
|
||||||
int FileOffset, Length;
|
int FileOffset, Length;
|
||||||
@ -126,6 +127,11 @@ void cCuttingThread::Action(void)
|
|||||||
FileSize = 0;
|
FileSize = 0;
|
||||||
}
|
}
|
||||||
LastIFrame = 0;
|
LastIFrame = 0;
|
||||||
|
|
||||||
|
if (cutIn) {
|
||||||
|
cRemux::SetBrokenLink(buffer, Length);
|
||||||
|
cutIn = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (safe_write(toFile, buffer, Length) < 0) {
|
if (safe_write(toFile, buffer, Length) < 0) {
|
||||||
error = "safe_write";
|
error = "safe_write";
|
||||||
@ -151,6 +157,7 @@ void cCuttingThread::Action(void)
|
|||||||
Index = Mark->position;
|
Index = Mark->position;
|
||||||
Mark = fromMarks.Next(Mark);
|
Mark = fromMarks.Next(Mark);
|
||||||
CurrentFileNumber = 0; // triggers SetOffset before reading next frame
|
CurrentFileNumber = 0; // triggers SetOffset before reading next frame
|
||||||
|
cutIn = true;
|
||||||
if (Setup.SplitEditedFiles) {
|
if (Setup.SplitEditedFiles) {
|
||||||
toFile = toFileName->NextFile();
|
toFile = toFileName->NextFile();
|
||||||
if (toFile < 0) {
|
if (toFile < 0) {
|
||||||
|
4
device.h
4
device.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: device.h 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
|
#ifndef __DEVICE_H
|
||||||
@ -188,7 +188,7 @@ private:
|
|||||||
bool active;
|
bool active;
|
||||||
virtual void Action(void);
|
virtual void Action(void);
|
||||||
protected:
|
protected:
|
||||||
enum ePidType { ptAudio, ptVideo, ptTeletext, ptDolby, ptOther };
|
enum ePidType { ptAudio, ptVideo, ptPcr, ptTeletext, ptDolby, ptOther };
|
||||||
class cPidHandle {
|
class cPidHandle {
|
||||||
public:
|
public:
|
||||||
int pid;
|
int pid;
|
||||||
|
12
dvbdevice.c
12
dvbdevice.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: dvbdevice.c 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"
|
#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));
|
CHECK(ioctl(fd_video, VIDEO_SET_FORMAT, VideoFormat16_9 ? VIDEO_FORMAT_16_9 : VIDEO_FORMAT_4_3));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ptAudio ptVideo ptTeletext ptDolby ptOther
|
// ptAudio ptVideo ptPcr ptTeletext ptDolby ptOther
|
||||||
dmx_pes_type_t PesTypes[] = { DMX_PES_AUDIO, DMX_PES_VIDEO, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER };
|
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)
|
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[ptAudio].pid);
|
||||||
DelPid(pidHandles[ptVideo].pid);
|
DelPid(pidHandles[ptVideo].pid);
|
||||||
|
DelPid(pidHandles[ptPcr].pid);
|
||||||
DelPid(pidHandles[ptTeletext].pid);
|
DelPid(pidHandles[ptTeletext].pid);
|
||||||
DelPid(pidHandles[ptDolby].pid);
|
DelPid(pidHandles[ptDolby].pid);
|
||||||
}
|
}
|
||||||
@ -683,7 +684,7 @@ bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
|
|||||||
if (TurnOnLivePIDs) {
|
if (TurnOnLivePIDs) {
|
||||||
aPid1 = Channel->Apid1();
|
aPid1 = Channel->Apid1();
|
||||||
aPid2 = Channel->Apid2();
|
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);
|
esyslog("ERROR: failed to set PIDs for channel %d on device %d", Channel->Number(), CardIndex() + 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -870,7 +871,6 @@ void cDvbDevice::Mute(void)
|
|||||||
|
|
||||||
void cDvbDevice::StillPicture(const uchar *Data, int Length)
|
void cDvbDevice::StillPicture(const uchar *Data, int Length)
|
||||||
{
|
{
|
||||||
Mute();
|
|
||||||
/* Using the VIDEO_STILLPICTURE ioctl call would be the
|
/* Using the VIDEO_STILLPICTURE ioctl call would be the
|
||||||
correct way to display a still frame, but unfortunately this
|
correct way to display a still frame, but unfortunately this
|
||||||
doesn't work with frames from VDR. So let's do pretty much the
|
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
|
//#define VIDEO_STILLPICTURE_WORKS_WITH_VDR_FRAMES
|
||||||
#ifdef 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));
|
CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp));
|
||||||
#else
|
#else
|
||||||
#define MIN_IFRAME 400000
|
#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
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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 "dvbplayer.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "recording.h"
|
#include "recording.h"
|
||||||
|
#include "remux.h"
|
||||||
#include "ringbuffer.h"
|
#include "ringbuffer.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
@ -190,6 +191,7 @@ private:
|
|||||||
bool eof;
|
bool eof;
|
||||||
bool active;
|
bool active;
|
||||||
bool running;
|
bool running;
|
||||||
|
bool firstPacket;
|
||||||
ePlayModes playMode;
|
ePlayModes playMode;
|
||||||
ePlayDirs playDir;
|
ePlayDirs playDir;
|
||||||
int trickSpeed;
|
int trickSpeed;
|
||||||
@ -197,7 +199,7 @@ private:
|
|||||||
bool canToggleAudioTrack;
|
bool canToggleAudioTrack;
|
||||||
uchar audioTrack;
|
uchar audioTrack;
|
||||||
cFrame *readFrame;
|
cFrame *readFrame;
|
||||||
const cFrame *playFrame;
|
cFrame *playFrame;
|
||||||
void TrickSpeed(int Increment);
|
void TrickSpeed(int Increment);
|
||||||
void Empty(void);
|
void Empty(void);
|
||||||
void StripAudioPackets(uchar *b, int Length, uchar Except = 0x00);
|
void StripAudioPackets(uchar *b, int Length, uchar Except = 0x00);
|
||||||
@ -240,6 +242,7 @@ cDvbPlayer::cDvbPlayer(const char *FileName)
|
|||||||
eof = false;
|
eof = false;
|
||||||
active = true;
|
active = true;
|
||||||
running = false;
|
running = false;
|
||||||
|
firstPacket = true;
|
||||||
playMode = pmPlay;
|
playMode = pmPlay;
|
||||||
playDir = pdForward;
|
playDir = pdForward;
|
||||||
trickSpeed = NORMAL_SPEED;
|
trickSpeed = NORMAL_SPEED;
|
||||||
@ -307,6 +310,7 @@ void cDvbPlayer::Empty(void)
|
|||||||
ringBuffer->Clear();
|
ringBuffer->Clear();
|
||||||
backTrace->Clear();
|
backTrace->Clear();
|
||||||
DeviceClear();
|
DeviceClear();
|
||||||
|
firstPacket = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cDvbPlayer::StripAudioPackets(uchar *b, int Length, uchar Except)
|
void cDvbPlayer::StripAudioPackets(uchar *b, int Length, uchar Except)
|
||||||
@ -403,7 +407,7 @@ void cDvbPlayer::Action(void)
|
|||||||
dsyslog("dvbplayer thread started (pid=%d)", getpid());
|
dsyslog("dvbplayer thread started (pid=%d)", getpid());
|
||||||
|
|
||||||
uchar *b = NULL;
|
uchar *b = NULL;
|
||||||
const uchar *p = NULL;
|
uchar *p = NULL;
|
||||||
int pc = 0;
|
int pc = 0;
|
||||||
|
|
||||||
readIndex = Resume();
|
readIndex = Resume();
|
||||||
@ -510,6 +514,10 @@ void cDvbPlayer::Action(void)
|
|||||||
if (!p) {
|
if (!p) {
|
||||||
p = playFrame->Data();
|
p = playFrame->Data();
|
||||||
pc = playFrame->Count();
|
pc = playFrame->Count();
|
||||||
|
if (firstPacket) {
|
||||||
|
cRemux::SetBrokenLink(p, pc);
|
||||||
|
firstPacket = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (p) {
|
if (p) {
|
||||||
int w = PlayVideo(p, pc);
|
int w = PlayVideo(p, pc);
|
||||||
|
13
eit.c
13
eit.c
@ -16,7 +16,7 @@
|
|||||||
* the Free Software Foundation; either version 2 of the License, or *
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
* (at your option) any later version. *
|
* (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"
|
#include "eit.h"
|
||||||
@ -1232,7 +1232,7 @@ void cSIProcessor::Action()
|
|||||||
int r = safe_read(filters[a].handle, buf, sizeof(buf));
|
int r = safe_read(filters[a].handle, buf, sizeof(buf));
|
||||||
if (r > 3) // minimum number of bytes necessary to get section length
|
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;
|
int pid = filters[a].pid;
|
||||||
if (seclen == r)
|
if (seclen == r)
|
||||||
{
|
{
|
||||||
@ -1444,9 +1444,11 @@ int cSIProcessor::GetCaDescriptors(int Source, int Transponder, int ServiceId, c
|
|||||||
if (BufSize > 0 && Data) {
|
if (BufSize > 0 && Data) {
|
||||||
cMutexLock MutexLock(&caDescriptorsMutex);
|
cMutexLock MutexLock(&caDescriptorsMutex);
|
||||||
int length = 0;
|
int length = 0;
|
||||||
do {
|
|
||||||
for (cCaDescriptor *d = caDescriptors.First(); d; d = caDescriptors.Next(d)) {
|
for (cCaDescriptor *d = caDescriptors.First(); d; d = caDescriptors.Next(d)) {
|
||||||
if (d->source == Source && d->transponder == Transponder && d->serviceId == ServiceId && d->caSystem == *CaSystemIds) {
|
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) {
|
if (length + d->Length() <= BufSize) {
|
||||||
memcpy(Data + length, d->Data(), d->Length());
|
memcpy(Data + length, d->Data(), d->Length());
|
||||||
length += d->Length();
|
length += d->Length();
|
||||||
@ -1454,8 +1456,9 @@ int cSIProcessor::GetCaDescriptors(int Source, int Transponder, int ServiceId, c
|
|||||||
else
|
else
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
} while (*++caids);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} while (*++CaSystemIds);
|
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: interface.c 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"
|
#include "interface.h"
|
||||||
@ -56,6 +56,7 @@ void cInterface::Close(void)
|
|||||||
|
|
||||||
eKeys cInterface::GetKey(bool Wait)
|
eKeys cInterface::GetKey(bool Wait)
|
||||||
{
|
{
|
||||||
|
if (!cRemote::HasKeys())
|
||||||
Flush();
|
Flush();
|
||||||
if (SVDRP) {
|
if (SVDRP) {
|
||||||
if (SVDRP->Process())
|
if (SVDRP->Process())
|
||||||
|
10
lirc.c
10
lirc.c
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* LIRC support added by Carsten Koch <Carsten.Koch@icem.de> 2000-06-16.
|
* 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"
|
#include "lirc.h"
|
||||||
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
#define REPEATLIMIT 20 // ms
|
#define REPEATLIMIT 20 // ms
|
||||||
#define REPEATDELAY 350 // ms
|
#define REPEATDELAY 350 // ms
|
||||||
|
#define KEYPRESSDELAY 150 // ms
|
||||||
|
|
||||||
cLircRemote::cLircRemote(char *DeviceName)
|
cLircRemote::cLircRemote(char *DeviceName)
|
||||||
:cRemote("LIRC")
|
:cRemote("LIRC")
|
||||||
@ -64,18 +65,21 @@ void cLircRemote::Action(void)
|
|||||||
bool ready = cFile::FileReady(f, timeout);
|
bool ready = cFile::FileReady(f, timeout);
|
||||||
int ret = ready ? safe_read(f, buf, sizeof(buf)) : -1;
|
int ret = ready ? safe_read(f, buf, sizeof(buf)) : -1;
|
||||||
|
|
||||||
if (ready) {
|
if (ready && ret <= 0 ) {
|
||||||
if (ret <= 21) {
|
|
||||||
esyslog("ERROR: lircd connection lost");
|
esyslog("ERROR: lircd connection lost");
|
||||||
close(f);
|
close(f);
|
||||||
f = -1;
|
f = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ready && ret > 21) {
|
||||||
int count;
|
int count;
|
||||||
char KeyName[LIRC_KEY_BUF];
|
char KeyName[LIRC_KEY_BUF];
|
||||||
sscanf(buf, "%*x %x %29s", &count, KeyName); // '29' in '%29s' is LIRC_KEY_BUF-1!
|
sscanf(buf, "%*x %x %29s", &count, KeyName); // '29' in '%29s' is LIRC_KEY_BUF-1!
|
||||||
int Now = time_ms();
|
int Now = time_ms();
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
|
if (strcmp(KeyName, LastKeyName) == 0 && Now - FirstTime < KEYPRESSDELAY)
|
||||||
|
continue; // skip keys coming in too fast
|
||||||
if (repeat)
|
if (repeat)
|
||||||
Put(LastKeyName, false, true);
|
Put(LastKeyName, false, true);
|
||||||
strcpy(LastKeyName, KeyName);
|
strcpy(LastKeyName, KeyName);
|
||||||
|
15
menu.c
15
menu.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: menu.c 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"
|
#include "menu.h"
|
||||||
@ -28,7 +28,7 @@
|
|||||||
#include "videodir.h"
|
#include "videodir.h"
|
||||||
|
|
||||||
#define MENUTIMEOUT 120 // seconds
|
#define MENUTIMEOUT 120 // seconds
|
||||||
#define MAXWAIT4EPGINFO 10 // seconds
|
#define MAXWAIT4EPGINFO 3 // seconds
|
||||||
#define MODETIMEOUT 3 // seconds
|
#define MODETIMEOUT 3 // seconds
|
||||||
|
|
||||||
#define MAXRECORDCONTROLS (MAXDEVICES * MAXRECEIVERS)
|
#define MAXRECORDCONTROLS (MAXDEVICES * MAXRECEIVERS)
|
||||||
@ -575,6 +575,7 @@ void cMenuEditChannel::Setup(void)
|
|||||||
Add(new cMenuEditSrcItem( tr("Source"), &data.source));
|
Add(new cMenuEditSrcItem( tr("Source"), &data.source));
|
||||||
Add(new cMenuEditIntItem( tr("Frequency"), &data.frequency));
|
Add(new cMenuEditIntItem( tr("Frequency"), &data.frequency));
|
||||||
Add(new cMenuEditIntItem( tr("Vpid"), &data.vpid, 0, 0x1FFF));
|
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("Apid1"), &data.apid1, 0, 0x1FFF));
|
||||||
Add(new cMenuEditIntItem( tr("Apid2"), &data.apid2, 0, 0x1FFF));
|
Add(new cMenuEditIntItem( tr("Apid2"), &data.apid2, 0, 0x1FFF));
|
||||||
Add(new cMenuEditIntItem( tr("Dpid1"), &data.dpid1, 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)
|
eOSState cMenuMain::ProcessKey(eKeys Key)
|
||||||
{
|
{
|
||||||
|
bool HadSubMenu = HasSubMenu();
|
||||||
int osdLanguage = Setup.OSDLanguage;
|
int osdLanguage = Setup.OSDLanguage;
|
||||||
eOSState state = cOsdMenu::ProcessKey(Key);
|
eOSState state = cOsdMenu::ProcessKey(Key);
|
||||||
|
HadSubMenu |= HasSubMenu();
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case osSchedule: return AddSubMenu(new cMenuSchedule);
|
case osSchedule: return AddSubMenu(new cMenuSchedule);
|
||||||
@ -2543,10 +2546,10 @@ eOSState cMenuMain::ProcessKey(eKeys Key)
|
|||||||
break;
|
break;
|
||||||
default: switch (Key) {
|
default: switch (Key) {
|
||||||
case kRecord:
|
case kRecord:
|
||||||
case kRed: if (!HasSubMenu())
|
case kRed: if (!HadSubMenu)
|
||||||
state = osRecord;
|
state = osRecord;
|
||||||
break;
|
break;
|
||||||
case kGreen: if (!HasSubMenu()) {
|
case kGreen: if (!HadSubMenu) {
|
||||||
int CurrentAudioTrack = -1;
|
int CurrentAudioTrack = -1;
|
||||||
const char **AudioTracks = cDevice::PrimaryDevice()->GetAudioTracks(&CurrentAudioTrack);
|
const char **AudioTracks = cDevice::PrimaryDevice()->GetAudioTracks(&CurrentAudioTrack);
|
||||||
if (AudioTracks) {
|
if (AudioTracks) {
|
||||||
@ -2560,10 +2563,10 @@ eOSState cMenuMain::ProcessKey(eKeys Key)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case kYellow: if (!HasSubMenu())
|
case kYellow: if (!HadSubMenu)
|
||||||
state = osPause;
|
state = osPause;
|
||||||
break;
|
break;
|
||||||
case kBlue: if (!HasSubMenu())
|
case kBlue: if (!HadSubMenu)
|
||||||
state = replaying ? osStopReplay : cReplayControl::LastReplayed() ? osReplay : osContinue;
|
state = replaying ? osStopReplay : cReplayControl::LastReplayed() ? osReplay : osContinue;
|
||||||
break;
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
|
3
remote.h
3
remote.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: 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
|
#ifndef __REMOTE_H
|
||||||
@ -45,6 +45,7 @@ public:
|
|||||||
static bool Put(eKeys Key);
|
static bool Put(eKeys Key);
|
||||||
static bool PutMacro(eKeys Key);
|
static bool PutMacro(eKeys Key);
|
||||||
static const char *GetPlugin(void) { return plugin; }
|
static const char *GetPlugin(void) { return plugin; }
|
||||||
|
static bool HasKeys(void) { return in != out; }
|
||||||
static eKeys Get(int WaitMs = 1000, char **UnknownCode = NULL);
|
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
|
* the Linux DVB driver's 'tuxplayer' example and were rewritten to suit
|
||||||
* VDR's needs.
|
* 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
|
/* The calling interface of the 'cRemux::Process()' function is defined
|
||||||
@ -621,6 +621,7 @@ XXX*/
|
|||||||
else if (!synced) {
|
else if (!synced) {
|
||||||
if (pt == I_FRAME) {
|
if (pt == I_FRAME) {
|
||||||
resultDelivered = i; // will drop everything before this position
|
resultDelivered = i; // will drop everything before this position
|
||||||
|
SetBrokenLink(resultBuffer + i, l);
|
||||||
synced = true;
|
synced = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -667,3 +668,18 @@ XXX*/
|
|||||||
return NULL; // no useful data found, wait for more
|
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
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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
|
#ifndef __REMUX_H
|
||||||
@ -44,6 +44,7 @@ public:
|
|||||||
cRemux(int VPid, int APid1, int APid2, int DPid1, int DPid2, bool ExitOnFailure = false);
|
cRemux(int VPid, int APid1, int APid2, int DPid1, int DPid2, bool ExitOnFailure = false);
|
||||||
~cRemux();
|
~cRemux();
|
||||||
uchar *Process(const uchar *Data, int &Count, int &Result, uchar *PictureType = NULL);
|
uchar *Process(const uchar *Data, int &Count, int &Result, uchar *PictureType = NULL);
|
||||||
|
static void SetBrokenLink(uchar *Data, int Length);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __REMUX_H
|
#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
|
* Parts of this file were inspired by the 'ringbuffy.c' from the
|
||||||
* LinuxDVB driver (see linuxtv.org).
|
* 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"
|
#include "ringbuffer.h"
|
||||||
@ -142,9 +142,9 @@ int cRingBufferLinear::Put(const uchar *Data, int Count)
|
|||||||
return Count;
|
return Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uchar *cRingBufferLinear::Get(int &Count)
|
uchar *cRingBufferLinear::Get(int &Count)
|
||||||
{
|
{
|
||||||
const uchar *p = NULL;
|
uchar *p = NULL;
|
||||||
Lock();
|
Lock();
|
||||||
if (getThreadPid < 0)
|
if (getThreadPid < 0)
|
||||||
getThreadPid = getpid();
|
getThreadPid = getpid();
|
||||||
@ -224,7 +224,7 @@ cRingBufferFrame::~cRingBufferFrame()
|
|||||||
void cRingBufferFrame::Clear(void)
|
void cRingBufferFrame::Clear(void)
|
||||||
{
|
{
|
||||||
Lock();
|
Lock();
|
||||||
const cFrame *p;
|
cFrame *p;
|
||||||
while ((p = Get()) != NULL)
|
while ((p = Get()) != NULL)
|
||||||
Drop(p);
|
Drop(p);
|
||||||
Unlock();
|
Unlock();
|
||||||
@ -252,7 +252,7 @@ bool cRingBufferFrame::Put(cFrame *Frame)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const cFrame *cRingBufferFrame::Get(void)
|
cFrame *cRingBufferFrame::Get(void)
|
||||||
{
|
{
|
||||||
Lock();
|
Lock();
|
||||||
cFrame *p = head ? head->next : NULL;
|
cFrame *p = head ? head->next : NULL;
|
||||||
@ -260,13 +260,13 @@ const cFrame *cRingBufferFrame::Get(void)
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cRingBufferFrame::Delete(const cFrame *Frame)
|
void cRingBufferFrame::Delete(cFrame *Frame)
|
||||||
{
|
{
|
||||||
currentFill -= Frame->Count();
|
currentFill -= Frame->Count();
|
||||||
delete Frame;
|
delete Frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cRingBufferFrame::Drop(const cFrame *Frame)
|
void cRingBufferFrame::Drop(cFrame *Frame)
|
||||||
{
|
{
|
||||||
Lock();
|
Lock();
|
||||||
if (head) {
|
if (head) {
|
||||||
|
12
ringbuffer.h
12
ringbuffer.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: 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
|
#ifndef __RINGBUFFER_H
|
||||||
@ -56,7 +56,7 @@ public:
|
|||||||
int Put(const uchar *Data, int Count);
|
int Put(const uchar *Data, int Count);
|
||||||
///< Puts at most Count bytes of Data into the ring buffer.
|
///< Puts at most Count bytes of Data into the ring buffer.
|
||||||
///< \return Returns the number of bytes actually stored.
|
///< \return Returns the number of bytes actually stored.
|
||||||
const uchar *Get(int &Count);
|
uchar *Get(int &Count);
|
||||||
///< Gets data from the ring buffer.
|
///< Gets data from the ring buffer.
|
||||||
///< The data will remain in the buffer until a call to Del() deletes it.
|
///< 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
|
///< \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
|
///< 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.
|
///< Data. Otherwise it will allocate Count bytes of memory and copy Data.
|
||||||
~cFrame();
|
~cFrame();
|
||||||
const uchar *Data(void) const { return data; }
|
uchar *Data(void) const { return data; }
|
||||||
int Count(void) const { return count; }
|
int Count(void) const { return count; }
|
||||||
eFrameType Type(void) const { return type; }
|
eFrameType Type(void) const { return type; }
|
||||||
int Index(void) const { return index; }
|
int Index(void) const { return index; }
|
||||||
@ -93,7 +93,7 @@ class cRingBufferFrame : public cRingBuffer {
|
|||||||
private:
|
private:
|
||||||
cFrame *head;
|
cFrame *head;
|
||||||
int currentFill;
|
int currentFill;
|
||||||
void Delete(const cFrame *Frame);
|
void Delete(cFrame *Frame);
|
||||||
public:
|
public:
|
||||||
cRingBufferFrame(int Size, bool Statistics = false);
|
cRingBufferFrame(int Size, bool Statistics = false);
|
||||||
virtual ~cRingBufferFrame();
|
virtual ~cRingBufferFrame();
|
||||||
@ -103,10 +103,10 @@ public:
|
|||||||
bool Put(cFrame *Frame);
|
bool Put(cFrame *Frame);
|
||||||
// Puts the Frame into the ring buffer.
|
// Puts the Frame into the ring buffer.
|
||||||
// Returns true if this was possible.
|
// Returns true if this was possible.
|
||||||
const cFrame *Get(void);
|
cFrame *Get(void);
|
||||||
// Gets the next frame from the ring buffer.
|
// Gets the next frame from the ring buffer.
|
||||||
// The actual data still remains in the buffer until Drop() is called.
|
// 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().
|
// 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
|
* and interact with the Video Disk Recorder - or write a full featured
|
||||||
* graphical interface that sits on top of an SVDRP connection.
|
* graphical interface that sits on top of an SVDRP connection.
|
||||||
*
|
*
|
||||||
* $Id: svdrp.c 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"
|
#include "svdrp.h"
|
||||||
@ -33,6 +33,7 @@
|
|||||||
#include "remote.h"
|
#include "remote.h"
|
||||||
#include "timers.h"
|
#include "timers.h"
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
|
#include "videodir.h"
|
||||||
|
|
||||||
// --- cSocket ---------------------------------------------------------------
|
// --- cSocket ---------------------------------------------------------------
|
||||||
|
|
||||||
@ -250,6 +251,8 @@ const char *HelpPages[] = {
|
|||||||
" format defined in vdr(5) for the 'epg.data' file. A '.' on a line\n"
|
" 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"
|
" by itself terminates the input and starts processing of the data (all\n"
|
||||||
" entered data is buffered until the terminating '.' is seen).",
|
" entered data is buffered until the terminating '.' is seen).",
|
||||||
|
"STAT disk\n"
|
||||||
|
" Return information about disk usage (total, free, percent).",
|
||||||
"UPDT <settings>\n"
|
"UPDT <settings>\n"
|
||||||
" Updates a timer. Settings must be in the same format as returned\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"
|
" 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);
|
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)
|
void cSVDRP::CmdUPDT(const char *Option)
|
||||||
{
|
{
|
||||||
if (*Option) {
|
if (*Option) {
|
||||||
@ -1021,6 +1040,7 @@ void cSVDRP::Execute(char *Cmd)
|
|||||||
else if (CMD("NEWT")) CmdNEWT(s);
|
else if (CMD("NEWT")) CmdNEWT(s);
|
||||||
else if (CMD("NEXT")) CmdNEXT(s);
|
else if (CMD("NEXT")) CmdNEXT(s);
|
||||||
else if (CMD("PUTE")) CmdPUTE(s);
|
else if (CMD("PUTE")) CmdPUTE(s);
|
||||||
|
else if (CMD("STAT")) CmdSTAT(s);
|
||||||
else if (CMD("UPDT")) CmdUPDT(s);
|
else if (CMD("UPDT")) CmdUPDT(s);
|
||||||
else if (CMD("VOLU")) CmdVOLU(s);
|
else if (CMD("VOLU")) CmdVOLU(s);
|
||||||
else if (CMD("QUIT")) Close();
|
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
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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
|
#ifndef __SVDRP_H
|
||||||
@ -73,6 +73,7 @@ private:
|
|||||||
void CmdNEWT(const char *Option);
|
void CmdNEWT(const char *Option);
|
||||||
void CmdNEXT(const char *Option);
|
void CmdNEXT(const char *Option);
|
||||||
void CmdPUTE(const char *Option);
|
void CmdPUTE(const char *Option);
|
||||||
|
void CmdSTAT(const char *Option);
|
||||||
void CmdUPDT(const char *Option);
|
void CmdUPDT(const char *Option);
|
||||||
void CmdVOLU(const char *Option);
|
void CmdVOLU(const char *Option);
|
||||||
void Execute(char *Cmd);
|
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
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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"
|
#include "timers.h"
|
||||||
@ -336,7 +336,7 @@ time_t cTimer::StopTime(void)
|
|||||||
void cTimer::SetRecording(bool Recording)
|
void cTimer::SetRecording(bool Recording)
|
||||||
{
|
{
|
||||||
recording = 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)
|
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
|
.\" License as specified in the file COPYING that comes with the
|
||||||
.\" vdr distribution.
|
.\" 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"
|
.TH vdr 5 "6 Dec 2002" "1.2.0" "Video Disk Recorder Files"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
@ -105,6 +105,9 @@ The symbol rate of this channel (DVB-S and DVB-C only).
|
|||||||
.TP
|
.TP
|
||||||
.B VPID
|
.B VPID
|
||||||
The video PID (set to '0' for radio channels, '1' for encrypted radio channels).
|
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
|
.TP
|
||||||
.B APID
|
.B APID
|
||||||
The audio PID (either one number, or two, separated by a comma).
|
The audio PID (either one number, or two, separated by a comma).
|
||||||
|
Loading…
x
Reference in New Issue
Block a user