Commit 0686038a authored by Klaus Schmidinger's avatar Klaus Schmidinger

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).
parent 21a52ccb
......@@ -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, &parambuf, &sourcebuf, &srate, &vpid, &apidbuf, &tpid, &ca, &sid, &nid, &tid, &rid);
int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%d :%d :%d :%d :%d :%d ", &namebuf, &frequency, &parambuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpid, &ca, &sid, &nid, &tid, &rid);
if (fields >= 9) {
if (fields == 9) {
// allow reading of old format
......@@ -335,12 +343,19 @@ bool cChannel::Parse(const char *s, bool AllowNonUniqueID)
ca = tpid;
tpid = 0;
}
vpid = ppid = 0;
apid1 = apid2 = 0;
dpid1 = dpid2 = 0;
bool ok = false;
if (parambuf && sourcebuf && apidbuf) {
if (parambuf && sourcebuf && vpidbuf && apidbuf) {
ok = StringToParameters(parambuf) && (source = cSource::FromString(sourcebuf)) >= 0;
char *p = strchr(apidbuf, ';');
char *p = strchr(vpidbuf, '+');
if (p)
*p++ = 0;
sscanf(vpidbuf, "%d", &vpid);
if (p)
sscanf(p, "%d", &ppid);
p = strchr(apidbuf, ';');
if (p)
*p++ = 0;
sscanf(apidbuf, "%d ,%d ", &apid1, &apid2);
......@@ -350,6 +365,7 @@ bool cChannel::Parse(const char *s, bool AllowNonUniqueID)
strn0cpy(name, namebuf, MaxChannelName);
free(parambuf);
free(sourcebuf);
free(vpidbuf);
free(apidbuf);
free(namebuf);
if (!AllowNonUniqueID && Channels.GetByChannelID(GetChannelID())) {
......
......@@ -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,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;
......
......@@ -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
......
......@@ -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;
......
......@@ -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
......@@ -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) {
......
......@@ -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 $