diff options
author | Klaus Schmidinger <kls (at) cadsoft (dot) de> | 2003-04-27 18:00:00 +0200 |
---|---|---|
committer | Klaus Schmidinger <kls (at) cadsoft (dot) de> | 2003-04-27 18:00:00 +0200 |
commit | 0686038af36be65b666bce669957c4d94c13f409 (patch) | |
tree | 50c5bc80b5f49e0bc14b6846f1f53794c5da6f65 | |
parent | 21a52ccb6d43cce35f7a381f55ea291195416f33 (diff) | |
download | vdr-patch-lnbsharing-0686038af36be65b666bce669957c4d94c13f409.tar.gz vdr-patch-lnbsharing-0686038af36be65b666bce669957c4d94c13f409.tar.bz2 |
Version 1.1.29vdr-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).
-rw-r--r-- | CONTRIBUTORS | 28 | ||||
-rw-r--r-- | HISTORY | 31 | ||||
-rw-r--r-- | INSTALL | 5 | ||||
-rw-r--r-- | channels.c | 28 | ||||
-rw-r--r-- | channels.conf | 1 | ||||
-rw-r--r-- | channels.conf.terr | 30 | ||||
-rw-r--r-- | channels.h | 4 | ||||
-rw-r--r-- | config.h | 4 | ||||
-rw-r--r-- | cutter.c | 9 | ||||
-rw-r--r-- | device.h | 4 | ||||
-rw-r--r-- | dvbdevice.c | 12 | ||||
-rw-r--r-- | dvbplayer.c | 14 | ||||
-rw-r--r-- | eit.c | 27 | ||||
-rw-r--r-- | interface.c | 5 | ||||
-rw-r--r-- | lirc.c | 20 | ||||
-rw-r--r-- | menu.c | 15 | ||||
-rw-r--r-- | remote.h | 3 | ||||
-rw-r--r-- | remux.c | 18 | ||||
-rw-r--r-- | remux.h | 3 | ||||
-rw-r--r-- | ringbuffer.c | 14 | ||||
-rw-r--r-- | ringbuffer.h | 12 | ||||
-rw-r--r-- | svdrp.c | 22 | ||||
-rw-r--r-- | svdrp.h | 3 | ||||
-rw-r--r-- | timers.c | 4 | ||||
-rw-r--r-- | vdr.5 | 5 |
25 files changed, 239 insertions, 82 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index d05b928..37394db 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -169,6 +169,8 @@ Stefan Huelswitt <huels@iname.com> for adapting VDR to 'libdtv' version 0.0.5 for reporting a bug in handling of Ca parameters with values <= MAXDEVICES, which don't indicate an actual encrypted channel + for implementing setting the "broken link" flag for GOPs at the beginning of a new + video sequence, which avoids artefacts when cutting Ulrich Röder <roeder@efr-net.de> for pointing out that there are channels that have a symbol rate higher than @@ -197,6 +199,7 @@ Andreas Schultz <aschultz@warp10.net> cMenuRecordings::Del(), which caused warnings with gcc-3.2 for suggesting a Make.config file for making EIT filtering use masks to reduce the number of filters + for suggesting to remove the Mute() call from cDvbDevice::StillPicture() Aaron Holtzman for writing 'ac3dec' @@ -548,11 +551,12 @@ Walter Stroebel <walter.stroebel@lifeline.nl> Paul Gohn <pgohn@nexgo.de> for adding 'Hrvatska radiotelevizija' and 'RTV Slovenija' to ca.conf -Teemu Rantanen <tvr@iki.fi> +Teemu Rantanen <teemu.rantanen@tekla.com> for increased the maximum possible packet size in remux.c to avoid corrupted streams with broadcasters that send extremely large PES packets for adding TS error checking to remux.c for pinpointing a problem with excessive memmove() calls in 'Transfer Mode' + for fixing faulty calculation of section length in eit.c Jan Ekholm <chakie@infa.abo.fi> for adding/improving some Swedish language OSD texts @@ -589,6 +593,28 @@ Ludwig Nussel <ludwig.nussel@web.de> Thomas Koch <tom@harhar.net> for his support in keeping the Premiere World channels up to date in 'channels.conf' + for implementing the SVDRP command STAT Stefan Hußfeldt <vdr@marvin.on-luebeck.de> for his help in keeping 'channels.conf.cable' up to date + +Christoph Friederich <christoph.friederich@gmx.de> + for reporting a bug in deleting the last recording in the "Recordings" menu, which + started pausing live video + +Andreas Brachold <andy03@deltab.de> + for his support in keeping 'channels.conf.terr' up to date + +Manuel Hartl <icecep@gmx.net> + for suggesting to extend the logging info when starting/stopping timers + +Benjamin Harling <benjamin.harling@web.de> + for suggesting to add a note regarding non-VDR files in the /videoX directories to + INSTALL + +Christian Jacobsen <christian.jacobsen@stageholding.de> + for making the LIRC interface skip keys that come in too fast + +Andreas Mair <Andreas.Mair@linogate.com> + for reporting a short display of the main menu if a plugin displays its own OSD and + is started through a user defined key macro @@ -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). @@ -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: -------------------- @@ -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())) { diff --git a/channels.conf b/channels.conf index 13bc7e7..3909757 100644 --- a/channels.conf +++ b/channels.conf @@ -31,6 +31,7 @@ Bloomberg TV France:11817:v:S19.2E:27500:163:92:0:0:8004:0:0:0 Bloomberg TV Spain:12168:v:S19.2E:27500:167:112:0:0:12721:0:0:0 Sky News:11597:v:S19.2E:22000:305:306:0:0:28707:0:0:0 Fox Kids Netherlands:12574:h:S19.2E:22000:163:92:0:0:5020:0:0:0 +BVN:12574:h:S19.2E:22000:164+131:96:0:0:5025:0:0:0 Alice:12610:v:S19.2E:22000:162:96:0:0:12200:0:0:0 n-tv:12670:v:S19.2E:22000:162:96:55:0:12730:0:0:0 Al Jazeera:11568:v:S19.2E:22000:55:56:0:0:9021:0:0:0 diff --git a/channels.conf.terr b/channels.conf.terr index b618319..548f021 100644 --- a/channels.conf.terr +++ b/channels.conf.terr @@ -46,14 +46,22 @@ KISS (RADIO):537833:I0C34D0M16B8T2G32Y0:T:27500:0:1101:0:0:26176:0:0:0 oneword (RADIO):537833:I0C34D0M16B8T2G32Y0:T:27500:0:1501:0:0:26432:0:0:0 Smash Hits! (RADIO):537833:I0C34D0M16B8T2G32Y0:T:27500:0:1201:0:0:26240:0:0:0 : DVB-T Berlin Germany -PRO 7:658000:I0C23D0M16B8T8G8Y0:T:27500:305:306;307:0:0:16403:0:0:0 -SAT 1:658000:I0C23D0M16B8T8G8Y0:T:27500:385:386:0:0:16408:0:0:0 -RTL:658000:I0C23D0M16B8T8G8Y0:T:27500:337:338:0:0:16405:0:0:0 -RTL 2:658000:I0C23D0M16B8T8G8Y0:T:27500:353:354:0:0:16406:0:0:0 -Super RTL:778000:I0C23D0M16B8T8G8Y0:T:27500:433:434:0:0:16411:0:0:0 -VOX:778000:I0C23D0M16B8T8G8Y0:T:27500:545:546:0:0:16418:0:0:0 -KABEL 1:778000:I0C23D0M16B8T8G8Y0:T:27500:161:162:0:0:16394:0:0:0 -MTV:650000:I0C23D0M16B8T2G8Y0:T:27500:193:194:0:0:16396:0:0:0 -N-TV:650000:I0C23D0M16B8T2G8Y0:T:27500:273:274:0:0:16401:0:0:0 -N24:778000:I0C23D0M16B8T8G8Y0:T:27500:225:226:0:0:16398:0:0:0 -FAB:650000:I0C23D0M16B8T2G8Y0:T:27500:3073:3074:0:0:16576:0:0:0 +RTL:506000:I0C23D0M16B8T8G8Y0:T:27500:337:338:343:0:16405:0:0:0 +RTL2:506000:I0C23D0M16B8T8G8Y0:T:27500:353:354:359:0:16406:0:0:0 +Super RTL:506000:I0C23D0M16B8T8G8Y0:T:27500:433:434:439:0:16411:0:0:0 +VOX:506000:I0C23D0M16B8T8G8Y0:T:27500:545:546:551:0:16418:0:0:0 +ORB-Fernsehen:522000:I0C23D0M16B8T8G8Y0:T:27500:1101:1102:1104:0:11:0:0:0 +SFB1:522000:I0C23D0M16B8T8G8Y0:T:27500:1201:1202:1204:0:12:0:0:0 +Phoenix:522000:I0C23D0M16B8T8G8Y0:T:27500:1301:1302:1304:0:13:0:0:0 +Das Erste:522000:I0C23D0M16B8T8G8Y0:T:27500:1401:1402:1404:0:14:0:0:0 +ZDF:570000:I0C23D0M16B8T8G8Y0:T:27500:545:546:551:0:514:0:0:0 +ZDFinfokanal:570000:I0C23D0M16B8T8G8Y0:T:27500:561:562:551:0:515:0:0:0 +ZDFdokukanal:570000:I0C23D0M16B8T8G8Y0:T:27500:577:578:551:0:516:0:0:0 +KiKa:570000:I0C23D0M16B8T8G8Y0:T:27500:593:594:599:0:517:0:0:0 +Kabel 1:658000:I0C23D0M16B8T8G8Y0:T:27500:161:162:163:0:16394:0:0:0 +N24:658000:I0C23D0M16B8T8G8Y0:T:27500:225:226:227:0:16398:0:0:0 +ProSieben:658000:I0C23D0M16B8T8G8Y0:T:27500:305:306;307:308:0:16403:0:0:0 +SAT.1:658000:I0C23D0M16B8T8G8Y0:T:27500:385:386:387:0:16408:0:0:0 +MTV:778000:I0C23D0M16B8T8G8Y0:T:27500:193:194:199:0:16396:0:0:0 +n-tv:778000:I0C23D0M16B8T8G8Y0:T:27500:273:274:279:0:16401:0:0:0 +Eurosport:778000:I0C23D0M16B8T8G8Y0:T:27500:577:578:583:0:16420:0:0:0 @@ -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,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 @@ -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,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.h 1.29 2003/01/03 15:43:48 kls Exp $ + * $Id: device.h 1.30 2003/04/26 09:49:12 kls Exp $ */ #ifndef __DEVICE_H @@ -188,7 +188,7 @@ private: bool active; virtual void Action(void); protected: - enum ePidType { ptAudio, ptVideo, ptTeletext, ptDolby, ptOther }; + enum ePidType { ptAudio, ptVideo, ptPcr, ptTeletext, ptDolby, ptOther }; class cPidHandle { public: int pid; diff --git a/dvbdevice.c b/dvbdevice.c index c25ebef..d66cd76 100644 --- a/dvbdevice.c +++ b/dvbdevice.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbdevice.c 1.54 2003/04/19 14:24:25 kls Exp $ + * $Id: dvbdevice.c 1.56 2003/04/27 09:44:17 kls Exp $ */ #include "dvbdevice.h" @@ -524,8 +524,8 @@ void cDvbDevice::SetVideoFormat(bool VideoFormat16_9) CHECK(ioctl(fd_video, VIDEO_SET_FORMAT, VideoFormat16_9 ? VIDEO_FORMAT_16_9 : VIDEO_FORMAT_4_3)); } -// ptAudio ptVideo ptTeletext ptDolby ptOther -dmx_pes_type_t PesTypes[] = { DMX_PES_AUDIO, DMX_PES_VIDEO, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER }; +// ptAudio ptVideo ptPcr ptTeletext ptDolby ptOther +dmx_pes_type_t PesTypes[] = { DMX_PES_AUDIO, DMX_PES_VIDEO, DMX_PES_PCR, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER }; bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On) { @@ -662,6 +662,7 @@ bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) DelPid(pidHandles[ptAudio].pid); DelPid(pidHandles[ptVideo].pid); + DelPid(pidHandles[ptPcr].pid); DelPid(pidHandles[ptTeletext].pid); DelPid(pidHandles[ptDolby].pid); } @@ -683,7 +684,7 @@ bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) if (TurnOnLivePIDs) { aPid1 = Channel->Apid1(); aPid2 = Channel->Apid2(); - if (!(AddPid(Channel->Apid1(), ptAudio) && AddPid(Channel->Vpid(), ptVideo))) {//XXX+ dolby dpid1!!! (if audio plugins are attached) + if (!(AddPid(Channel->Ppid(), ptPcr) && AddPid(Channel->Apid1(), ptAudio) && AddPid(Channel->Vpid(), ptVideo))) {//XXX+ dolby dpid1!!! (if audio plugins are attached) esyslog("ERROR: failed to set PIDs for channel %d on device %d", Channel->Number(), CardIndex() + 1); return false; } @@ -870,7 +871,6 @@ void cDvbDevice::Mute(void) void cDvbDevice::StillPicture(const uchar *Data, int Length) { - Mute(); /* Using the VIDEO_STILLPICTURE ioctl call would be the correct way to display a still frame, but unfortunately this doesn't work with frames from VDR. So let's do pretty much the @@ -882,7 +882,7 @@ void cDvbDevice::StillPicture(const uchar *Data, int Length) */ //#define VIDEO_STILLPICTURE_WORKS_WITH_VDR_FRAMES #ifdef VIDEO_STILLPICTURE_WORKS_WITH_VDR_FRAMES - videoDisplayStillPicture sp = { (char *)Data, Length }; + video_still_picture sp = { (char *)Data, Length }; CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp)); #else #define MIN_IFRAME 400000 diff --git a/dvbplayer.c b/dvbplayer.c index f71c69c..afd4278 100644 --- a/dvbplayer.c +++ b/dvbplayer.c @@ -4,12 +4,13 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbplayer.c 1.19 2003/03/30 12:51:51 kls Exp $ + * $Id: dvbplayer.c 1.20 2003/04/27 09:55:53 kls Exp $ */ #include "dvbplayer.h" #include <stdlib.h> #include "recording.h" +#include "remux.h" #include "ringbuffer.h" #include "thread.h" #include "tools.h" @@ -190,6 +191,7 @@ private: bool eof; bool active; bool running; + bool firstPacket; ePlayModes playMode; ePlayDirs playDir; int trickSpeed; @@ -197,7 +199,7 @@ private: bool canToggleAudioTrack; uchar audioTrack; cFrame *readFrame; - const cFrame *playFrame; + cFrame *playFrame; void TrickSpeed(int Increment); void Empty(void); void StripAudioPackets(uchar *b, int Length, uchar Except = 0x00); @@ -240,6 +242,7 @@ cDvbPlayer::cDvbPlayer(const char *FileName) eof = false; active = true; running = false; + firstPacket = true; playMode = pmPlay; playDir = pdForward; trickSpeed = NORMAL_SPEED; @@ -307,6 +310,7 @@ void cDvbPlayer::Empty(void) ringBuffer->Clear(); backTrace->Clear(); DeviceClear(); + firstPacket = true; } void cDvbPlayer::StripAudioPackets(uchar *b, int Length, uchar Except) @@ -403,7 +407,7 @@ void cDvbPlayer::Action(void) dsyslog("dvbplayer thread started (pid=%d)", getpid()); uchar *b = NULL; - const uchar *p = NULL; + uchar *p = NULL; int pc = 0; readIndex = Resume(); @@ -510,6 +514,10 @@ void cDvbPlayer::Action(void) if (!p) { p = playFrame->Data(); pc = playFrame->Count(); + if (firstPacket) { + cRemux::SetBrokenLink(p, pc); + firstPacket = false; + } } if (p) { int w = PlayVideo(p, pc); @@ -16,7 +16,7 @@ * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * - * $Id: eit.c 1.72 2003/04/21 13:21:54 kls Exp $ + * $Id: eit.c 1.74 2003/04/27 14:41:36 kls Exp $ ***************************************************************************/ #include "eit.h" @@ -1232,7 +1232,7 @@ void cSIProcessor::Action() int r = safe_read(filters[a].handle, buf, sizeof(buf)); if (r > 3) // minimum number of bytes necessary to get section length { - int seclen = ((buf[1] & 0x0F) << 8) | (buf[2] & 0xFF) + 3; + int seclen = (((buf[1] & 0x0F) << 8) | (buf[2] & 0xFF)) + 3; int pid = filters[a].pid; if (seclen == r) { @@ -1444,18 +1444,21 @@ int cSIProcessor::GetCaDescriptors(int Source, int Transponder, int ServiceId, c if (BufSize > 0 && Data) { cMutexLock MutexLock(&caDescriptorsMutex); int length = 0; - do { - for (cCaDescriptor *d = caDescriptors.First(); d; d = caDescriptors.Next(d)) { - if (d->source == Source && d->transponder == Transponder && d->serviceId == ServiceId && d->caSystem == *CaSystemIds) { - if (length + d->Length() <= BufSize) { - memcpy(Data + length, d->Data(), d->Length()); - length += d->Length(); + for (cCaDescriptor *d = caDescriptors.First(); d; d = caDescriptors.Next(d)) { + if (d->source == Source && d->transponder == Transponder && d->serviceId == ServiceId) { + const unsigned short *caids = CaSystemIds; + do { + if (d->caSystem == *caids) { + if (length + d->Length() <= BufSize) { + memcpy(Data + length, d->Data(), d->Length()); + length += d->Length(); + } + else + return -1; } - else - return -1; - } + } while (*++caids); } - } while (*++CaSystemIds); + } return length; } return -1; diff --git a/interface.c b/interface.c index 9245c85..6431f91 100644 --- a/interface.c +++ b/interface.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: interface.c 1.63 2003/04/12 14:17:49 kls Exp $ + * $Id: interface.c 1.64 2003/04/27 12:08:52 kls Exp $ */ #include "interface.h" @@ -56,7 +56,8 @@ void cInterface::Close(void) eKeys cInterface::GetKey(bool Wait) { - Flush(); + if (!cRemote::HasKeys()) + Flush(); if (SVDRP) { if (SVDRP->Process()) Wait = false; @@ -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); @@ -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; @@ -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); }; @@ -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"); +} @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: remux.h 1.9 2002/11/01 10:06:46 kls Exp $ + * $Id: remux.h 1.10 2003/04/26 14:13:11 kls Exp $ */ #ifndef __REMUX_H @@ -44,6 +44,7 @@ public: cRemux(int VPid, int APid1, int APid2, int DPid1, int DPid2, bool ExitOnFailure = false); ~cRemux(); uchar *Process(const uchar *Data, int &Count, int &Result, uchar *PictureType = NULL); + static void SetBrokenLink(uchar *Data, int Length); }; #endif // __REMUX_H diff --git a/ringbuffer.c b/ringbuffer.c index 9eecbba..6913c71 100644 --- a/ringbuffer.c +++ b/ringbuffer.c @@ -7,7 +7,7 @@ * Parts of this file were inspired by the 'ringbuffy.c' from the * LinuxDVB driver (see linuxtv.org). * - * $Id: ringbuffer.c 1.14 2003/02/15 13:21:50 kls Exp $ + * $Id: ringbuffer.c 1.15 2003/04/27 09:54:32 kls Exp $ */ #include "ringbuffer.h" @@ -142,9 +142,9 @@ int cRingBufferLinear::Put(const uchar *Data, int Count) return Count; } -const uchar *cRingBufferLinear::Get(int &Count) +uchar *cRingBufferLinear::Get(int &Count) { - const uchar *p = NULL; + uchar *p = NULL; Lock(); if (getThreadPid < 0) getThreadPid = getpid(); @@ -224,7 +224,7 @@ cRingBufferFrame::~cRingBufferFrame() void cRingBufferFrame::Clear(void) { Lock(); - const cFrame *p; + cFrame *p; while ((p = Get()) != NULL) Drop(p); Unlock(); @@ -252,7 +252,7 @@ bool cRingBufferFrame::Put(cFrame *Frame) return false; } -const cFrame *cRingBufferFrame::Get(void) +cFrame *cRingBufferFrame::Get(void) { Lock(); cFrame *p = head ? head->next : NULL; @@ -260,13 +260,13 @@ const cFrame *cRingBufferFrame::Get(void) return p; } -void cRingBufferFrame::Delete(const cFrame *Frame) +void cRingBufferFrame::Delete(cFrame *Frame) { currentFill -= Frame->Count(); delete Frame; } -void cRingBufferFrame::Drop(const cFrame *Frame) +void cRingBufferFrame::Drop(cFrame *Frame) { Lock(); if (head) { diff --git a/ringbuffer.h b/ringbuffer.h index 9205df7..0ce0a48 100644 --- a/ringbuffer.h +++ b/ringbuffer.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: ringbuffer.h 1.9 2003/01/26 09:47:39 kls Exp $ + * $Id: ringbuffer.h 1.10 2003/04/27 09:55:08 kls Exp $ */ #ifndef __RINGBUFFER_H @@ -56,7 +56,7 @@ public: int Put(const uchar *Data, int Count); ///< Puts at most Count bytes of Data into the ring buffer. ///< \return Returns the number of bytes actually stored. - const uchar *Get(int &Count); + uchar *Get(int &Count); ///< Gets data from the ring buffer. ///< The data will remain in the buffer until a call to Del() deletes it. ///< \return Returns a pointer to the data, and stores the number of bytes @@ -83,7 +83,7 @@ public: ///< If Count is negative, the cFrame object will take ownership of the given ///< Data. Otherwise it will allocate Count bytes of memory and copy Data. ~cFrame(); - const uchar *Data(void) const { return data; } + uchar *Data(void) const { return data; } int Count(void) const { return count; } eFrameType Type(void) const { return type; } int Index(void) const { return index; } @@ -93,7 +93,7 @@ class cRingBufferFrame : public cRingBuffer { private: cFrame *head; int currentFill; - void Delete(const cFrame *Frame); + void Delete(cFrame *Frame); public: cRingBufferFrame(int Size, bool Statistics = false); virtual ~cRingBufferFrame(); @@ -103,10 +103,10 @@ public: bool Put(cFrame *Frame); // Puts the Frame into the ring buffer. // Returns true if this was possible. - const cFrame *Get(void); + cFrame *Get(void); // Gets the next frame from the ring buffer. // The actual data still remains in the buffer until Drop() is called. - void Drop(const cFrame *Frame); + void Drop(cFrame *Frame); // Drops the Frame that has just been fetched with Get(). }; @@ -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(); @@ -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,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) @@ -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). |