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:
		
							
								
								
									
										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<48>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).
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user